news 2026/5/8 13:49:47

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/4/24 19:27:15

SiFive平台下RISC-V用户模式与特权模式切换详解

深入SiFive平台:RISC-V用户态与特权态切换的底层逻辑与实战解析你有没有遇到过这样的情况?在SiFive开发板上跑一个裸机程序,突然ecall指令一执行就卡死;或者写了个简单的系统调用,结果返回后程序“飞了”——PC指针指向…

作者头像 李华
网站建设 2026/4/30 19:03:13

科技是把双刃剑ai到底是不是双刃剑

科技双刃剑属性概述定义科技双刃剑的核心特征(利弊并存)历史案例(如核能、互联网的正面与负面影响)引出AI作为典型双刃剑技术的争议性AI的积极应用场景效率提升:自动化生产、数据分析加速决策医疗突破:疾病…

作者头像 李华
网站建设 2026/5/2 7:11:51

安全继电器模块PCB原理图设计新手教程

从零开始设计一个安全继电器模块:原理图实战入门指南你有没有遇到过这样的情况?在做一个自动化控制项目时,明明程序写得没问题,继电器也“咔哒”响了,结果设备却在不该运行的时候突然启动——或者更糟,紧急…

作者头像 李华
网站建设 2026/5/5 20:28:20

Altium Designer中高速PCB布线的完整指南

高速PCB设计实战:在Altium Designer中驾驭信号完整性挑战你有没有遇到过这样的情况?电路原理图完美无缺,元器件选型严谨,可板子一上电,DDR就是跑不起来,时钟抖得像筛子,数据采集满屏乱码。反复检…

作者头像 李华
网站建设 2026/5/4 2:41:37

C++ 数据类型

C 基本数据类型C 提供了多种内置数据类型,用于存储不同种类的数据。这些数据类型可以分为以下几类:整型int:用于存储整数,通常占用 4 字节。short:短整型,通常占用 2 字节。long:长整型&#xf…

作者头像 李华
网站建设 2026/5/7 5:46:39

SPICE仿真中二极管温度特性影响的系统学习与实例分析

二极管温漂不是玄学:从SPICE仿真看温度如何“悄悄”改变电路行为你有没有遇到过这样的情况?一款在实验室25C下表现完美的电源电路,到了夏天高温环境却频频重启?或者一个低温环境下勉强启动的设备,在冷启动瞬间输出电压…

作者头像 李华