news 2026/6/10 16:30:14

Kafka从入门到入门

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kafka从入门到入门

kafka的出现是为了支持大量消息事件,它的分布式设计、消息抽象设计及存储选择和优化性能手段都高效的支持了它的性能表现,同时面临分布式系统典型的信息同步、中心化设计、负载均衡等问题,对于这些问题kafka也给出了高效和多样化的选择,这也给运维带来一定的复杂性。

架构

消息发送

  1. Broker地址获取:客户端初始化时配置bootstrap.servers,然后获取集群信息并保存到本地缓存,防治过多通信。
  2. 分区选择算法:发送消息时可以指定分区、由key来hash分区选择、或者采用默认策略选择分区(粘性分区策略)。
  3. Broker的确认机制:客户端在消息积累一定数量或者超过指定时间后会发送到BrokerBroker会根据配置的acks参数来决定何时返回写入结果。acks参数配置:
    1. 为0时:收到消息写入到系统I/O缓存后立即返回(刷盘由操作系统完成)
    2. 为1时:收到消息写入主分区的I/O缓存后返回。
    3. 为-1时:收到消息写入I/O缓存,等待ISR全部副本拉取完数据并返回LEOLeader更新HW后返回。
  4. 分区数据同步
    1. ISR(In-Sync Replicas)机制:保持数据同步和一致性
      AR​ 表示分配给某个分区的所有副本集合,包括 Leader 和所有 Follower。
      ISR​ 是 AR 的子集,表示与 Leader 保持同步的副本集合。只有 ISR 中的副本才有资格被选举为新的 Leader。
      OSR​ 是 AR 的子集,表示不能与 Leader 保持同步的副本集合。消息和leader副本相差replica.lag.time.max.ms则会被归入OSR集合中。
      注意:ISR和OSR都是动态调整的,目的是让副本尽量和Leader副本数据保持一致,保持系统的可用性
    2. HWLEO概念
      LEO 表示每个副本当前最后一条消息的偏移量**+1**,即下一条新消息将要写入的位置。每个副本的"写到哪里了"
      HW 表示已提交消息的偏移量。HW 之前的所有消息都已经成功复制到所有 ISR 副本中。消费者能看到的"最高水位"
    3. 副本会定时向Leader副本获取最新数据并更新自己的数据,返回自己的LEO,Leader在收到各个副本的LEO结果后会更新HW,这也对外(消费者可以看到)的消息就不断往前。

消息消费

  1. 获取消费协调者
    消费者组向任意一个Broker发送FindCoordinator请求,该Broker根据元信息找到该消费者组的GroupCoordinator。对应上图中的1-4过程(GroupCoordinatorBroker上的一个组件用于元数据管理、消费者控制,使用__consumer_offset的topic进行持久化,根据groupId进行__consumer_offset分区的选择,上图是简化了。)
  2. 加入消费组
    GroupCoordinator发送JoinGroup请求,GroupCoordinator会选择出消费者Leader进行分区分配,然后同步消费者该信息。消费者根据分配的分区拉取消息,比如上图中Consumer01分配了Partition0Partition2进行拉取消息进行消费。分区计算可以理解为在客户端(本地)进行计算减少了服务器的压力,只需要把结果同步到GroupCoordinator上。
  3. 元信息同步
    消费者组加入消费会触发rebalanceControllerBroker会进行分区分配并同步元信息到各个Broker

持久化和高性能

Topic是逻辑上的队列,在kafka的分布式设计上Topic又被分成多个分区,可以看成物理上的队列,在系统实现中体现为文件夹。分区的设计既保障了系统的可用性(冗余备份)又保证了系统的高并发性。为了性能考虑,分区实现又把文件进一步拆分限制大小(比如1G)和索引机制(快速查找offset)。

顺序写

kafka在转储消息数据时选择磁盘来作为临时存储,大部分场景消息很快就被消费掉,同时持久化仅防止数据丢失 不需要其他常见的分析和查询数据,选择磁盘是合适的。
磁盘存储查询和写入的耗时大家应该都了解在于磁头寻道上,写入读取数据耗时不大,所以顺序读写就显得格外重要,顺序和随机读写性能差异不在一个数量级。

零拷贝

网卡磁盘文件系统DMA控制器内核空间系统调用(内核态)Kafka应用(用户态)网卡磁盘文件系统DMA控制器内核空间系统调用(内核态)Kafka应用(用户态)Kafka零拷贝流程(sendfile系统调用)关键:数据不复制到用户空间第一次DMA传输磁盘→内核缓冲区第二次DMA传输内核缓冲区→网卡总计:1次系统调用 + 2次DMA传输数据始终在内核空间1. sendfile()系统调用2. 进入内核空间3. 定位文件位置4. 读取文件描述符5. 指令:磁盘→内核缓冲区6. 读取数据7. 数据流(DMA传输)8. 直接写入内核缓冲区9. 指令:内核缓冲区→网卡10. 读取内核缓冲区11. 直接发送到网卡12. 返回传输字节数13. 返回结果

批量发送

消息发送时客户端会打包多条消息一次发送到Broker以此来减少网络带来的耗时

分布式系统启示

  1. 分治思想:从设计上确立系统的性能优势。
  2. 冗余设计:保证服务的高可用性,同时需要同步机制辅助保证数据的一致性。
  3. 极致优化:把系统的每一部分实现尽可能的优化到极致,把常用的技术优化手段做到合理则能提升整体服务性能。
  4. 持续迭代:系统设计初期可以优先解决头部问题,然后持续优化痛点则可以保持系统的生命力。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/24 8:41:51

蜂鸣器报警模块快速理解:核心要点与基础测试演示

蜂鸣器报警模块实战指南:从原理到代码,轻松实现嵌入式音频反馈 你有没有遇到过这样的场景?设备出错了,但没有任何提示;或者程序跑起来了,却不知道是否正常启动。这时候,如果能“嘀”一声&#x…

作者头像 李华
网站建设 2026/6/5 15:10:15

8位加法器Verilog实现通俗解释

从全加器到8位加法器:用Verilog亲手搭建一个“二进制计算器”你有没有想过,计算机是怎么做加法的?不是打开计算器点两下那种——而是从最底层的晶体管开始,靠0和1自己算出来的那种。今天我们就来干一件“硬核”的事:用…

作者头像 李华
网站建设 2026/5/31 0:44:11

多路选择器电路分析:数字电路实验一文说清

多路选择器电路分析:从实验到实战的深度拆解 你有没有遇到过这样的情况——在数字电路实验课上,老师让你用几片74系列芯片搭一个“数据开关”,结果接线一通乱,拨码开关一动,LED却怎么都不按预期亮?或者&…

作者头像 李华
网站建设 2026/6/7 22:46:07

低成本PCBA打样方案:如何选择合适打样厂家

如何选对PCBA打样厂?一位硬件工程师的实战避坑指南最近在做一个工业传感器项目,从原理图到PCB布局都已搞定,接下来就是最关键的一步——打样。可当我打开几家主流PCBA平台比价时,却发现报价五花八门:有的贴片费低得离谱…

作者头像 李华
网站建设 2026/5/26 11:54:14

HBuilderX下载与Vue项目搭建完整示例演示

从零开始:用 HBuilderX 快速搭建 Vue 项目实战指南 你是不是也遇到过这样的场景? 刚想动手写个 Vue 页面,结果光是环境配置就卡了半天:Node.js 版本不对、vue-cli 安装失败、webpack 报错……明明只想写个页面,怎么比…

作者头像 李华
网站建设 2026/5/30 13:16:30

Multisim下载在虚拟课堂中的应用完整示例

用Multisim打造“永不打烊”的电子实验室:一位工科教师的实战手记最近在给大二学生上《模拟电子技术》时,有位同学私信问我:“老师,我在宿舍试了三遍共射放大电路,波形还是失真,但又不敢拆焊重来……” 我看…

作者头像 李华