news 2026/9/2 18:37:42

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/9/2 23:36:08

电源管理芯片同步整流技术深度剖析其硬件实现

同步整流如何让电源效率“起飞”?——从MOSFET到PMIC的硬核拆解你有没有想过,为什么现在的手机充电越来越快、待机越来越久,而机身却还能越做越薄?背后的功臣之一,正是藏在主板深处、默默工作的电源管理芯片&#xff0…

作者头像 李华
网站建设 2026/9/3 1:02:59

vivado许可证与高级综合(HLS)工具集成要点

从代码到硅片:绕不开的 Vivado 许可证与 HLS 集成实战指南 你有没有遇到过这样的场景? 写好了一段 C 算法,信心满满地打开 Vivado HLS,准备一键综合成硬件 IP。结果刚运行 open_solution ,控制台就跳出一行红字&am…

作者头像 李华
网站建设 2026/9/3 0:04:23

无源蜂鸣器驱动电路设计核心要点解析

无源蜂鸣器驱动电路设计:从原理到实战的完整指南在嵌入式系统开发中,声音提示早已不是“锦上添花”,而是人机交互的关键一环。无论是洗衣机完成洗涤时的一声“嘀”,还是智能门锁识别失败的连续警示音,背后都离不开一个…

作者头像 李华
网站建设 2026/9/3 3:16:20

基于Vivado的工业控制器烧写操作指南

Vivado烧写实战:让工业控制器真正“断电不丢魂” 你有没有遇到过这样的场景? 调试了整整一周的FPGA逻辑,终于在板子上跑通了EtherCAT主站协议,心跳信号稳定,IO响应及时。满心欢喜地拔掉JTAG线、断电重启——结果&…

作者头像 李华
网站建设 2026/9/2 23:34:52

一文说清PCB布线中的阻抗匹配核心要点

一文讲透高速PCB布线中的阻抗匹配:从原理到实战当信号跑得比光还“快”——我们为何必须关心PCB阻抗?在你拿起示波器调试DDR4内存时,是否见过眼图突然闭合?在调试PCIe链路时,是否遇到过误码率居高不下,却查…

作者头像 李华
网站建设 2026/9/2 22:58:17

组合逻辑电路优化技巧:门电路精简策略

组合逻辑优化实战:从门电路到芯片能效的精简艺术你有没有遇到过这样的情况?写完一段组合逻辑,功能完全正确,仿真也跑通了,但综合工具一跑,面积超标、时序不达标——明明逻辑很简单,怎么就“胖”…

作者头像 李华