加入收藏 | 设为首页 | 会员中心 | 我要投稿 南通站长网 (https://www.0513zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

广泛应用与巨大优势

发布时间:2021-02-17 15:59:18 所属栏目:外闻 来源:互联网
导读:通过以上代码就可以完成消息的生产了,kafka 给我们提供的这个 API 的功能确实非常简单易用,当然这里面实际上包含上比较多的细节,不过被 client 封装了进去,这里我们继续往深处挖掘下,看看隐藏在这段代码里面的可能存在的坑。 首先我们来简单分析下在这

通过以上代码就可以完成消息的生产了,kafka 给我们提供的这个 API 的功能确实非常简单易用,当然这里面实际上包含上比较多的细节,不过被 client 封装了进去,这里我们继续往深处挖掘下,看看隐藏在这段代码里面的可能存在的坑。

首先我们来简单分析下在这段代码里面 client 会做什么,(注:这里我们更倾向于给出一个通用工作流程,所以可能会忽略部分 java客户端独有特性 )。

1. client 通过代码中给出的 bootstrap.servers 去连接 broker,这里如果第一个broker 连接失败,那么 client 会从左往右重试去连接,直到全部连接失败或者某一个地址成功连接。

2. 当连接成功后,kafka client 会发起 ApiVersions request去kafka server 查询server 端支持各个 api 以及每个 api 最大的支持版本。从而达到 kafka 一个向下兼容的目的。当然由于 ApiVersions 是一个大约在 0.10 版本加入的 api,所以新版client 如果访问 0.9 版本的 kafka server 会引起ArrayIndexOutOfBoundsException 的报错,这个错误 kafka 官方在 0.10 的时候修复了。

3. 接下来 client 会查询将要发送消息的 topic 的元数据信息,向已经连接的 broker 发送 Metadata request,通过这个 api,kafka client 将会拿到集群 broker 的各种信息,包括 ip 和 port,以及 broker 对应的唯一 id,同时 client 也将获取到 topic的相关信息,parition 的 id 和 partition 选择出来的 leader replicas 所在 broker 的id,然后 client 将会建立 leader replicas 所在 broker 的连接,作为实际发送消息的数据链路。

在这里我们有三个细节需要注意

  • 第一点,如果 kafka 的 server 配置了 auto.create.topics.enable 为 true,那么如果 client 查询了一个不存在的 topic 元数据,这个 topic 随后会被 kafka server 自动创建。
  • 第二点,一般来说,kafka client 处理 Metadata 是一个定期刷新的动作,假如 Metadata 每过 30s 刷新一次,那么在这 30s 中,用户修改了 topic 配置增加了一个 partition,client 是无法感知的,需要等待到client 更新了 Metadata,生产端才会知道这个 topic 多出了一个 partition,才能往新的 partition 写入数据。
  • 那么如果在 Metadata 刷新时,由于 client 生产流量持续超过 kafka 配额限制,导致 kafka 限流,使得获取 Metadata 数据一直重试和超时,这种极端情况下,client 可能会非常长一段时间无法感知到 partition 的新增。
  • 这种情况在生产实践中也是发生过的,如果大家使用过程中发现了这种生产端迟迟不写入任何消息到新建的 partition 的情况,那么多半可以从这个方向入手。
  • 第三点,从 kafka 的建立链接的逻辑来看,kafka 实际上是会建立一条更多的链接的,同时也会直接链接到集群中不同的 broker 上,所以这里如果要申请防火墙策略,那么一定要为每个 broker 都申请好策略,否则可能会出现,能够拿到 Metadata,但无法生产消息的情况。

4.client 开始根据 message 中的 key 来计算 hash,确定这个 message 会被投递到哪个 partition 中去,然后 client 投递消息到本地的一个队列中,实际连接到partition 的投递者类,将从队列中取出消息,然后 client 会做两个检查之后调用Produce request 去投递消息。

  • 如果消息大于 max.request.size 则直接返回 RecordTooLargeException
  • 如果消息小于 batch.size 则等待后续消息,直到到消息大小总和大于 batch.size或者超过 linger.ms 规定的时间
  • client 将会启动一个异步过程或者同步过程等待 Produce request 的返回,然后将依据配置的重试策略来执行重试或者返回发送失败的错误到业务逻辑中,让业务逻辑进行错误处理。


实时访问数据的能力对于许多企业来说是必不可少的,在选择云计算提供商时应该考虑到这一点。企业必须确保云计算提供商有实时监控和流程,以便在停机中断时向其发出警报,以便企业可以迅速采取行动以最大程度地减少损失。

(5) 管理更复杂的环境

近年来,随着企业在公共云和私有云之间进行合并和转换,多云的使用量有所增加。大型技术提供商正在引领这种增长。Flexera公司发布的2020年云计算状态调查报告表明,93%的组织采用了多云策略。企业在与云计算提供商合作之前,需要确保企业将对与其他云计算系统一起使用该服务的能力进行研究,以及它是否提供了云计算提供商所需要的管理功能。

云迁移中面临的问题

云计算是一种变革性的技术,无疑将继续改变IT业务以及企业处理数据的方式。这些好处对很多企业都很重要,尤其是对于那些需要快速提高IT能力但在购买服务器设备和维护方面缺乏资金的中小型企业而言。

每个企业的情况都不一样。也就是说,在将业务转移到云平台时,企业面临的最大和最常见的问题是确保数据安全、降低成本、确保遵守行业法规,以及避免停机。

尽管迁移到云平台中涉及许多问题和挑战,但是正确解决这些问题可以使企业摆脱内部处理数据和存储的麻烦。

为了做出与云计算相关的最佳决策,企业首先需要制定一个战略计划,其中包括让企业的业务人员和IT人员积极参与进来。云迁移对企业来说不应是一个草率的举动,因为其对企业的业务将产生深远的影响。



(编辑:南通站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读