Kafka 深入分析,发送、消费消息全流程

本文深入解析Kafka消息系统的架构与工作原理,包括消息的生产、存储、消费过程,以及高可用性和容错机制。详细介绍了producer如何发布消息,broker如何保存消息,consumer如何消费消息,同时探讨了Kafka的高可用性策略。

Kafka的消息传递:首先我们要先定义好topic,然后producer生产message,push到broker,随后consumer 从订阅的toipc中pull到消息消费。

一、producer发布消息

1、写入方式

producer 采用 push 模式将消息发布到 broker,每条消息都被 append 到 patition 中,属于顺序写磁盘(顺序写磁盘效率比随机写内存要高,保障 kafka 吞吐率)。

2、消息路由

producer 发送消息到 broker 时,会根据分区算法选择将其存储到哪一个 partition。其路由机制为:

  • 指定了 patition,则直接使用。
  • 未指定 patition 但指定 key,通过对 key 的 value 进行hash 选出一个 patition。
  • patition 和 key 都未指定,使用轮询选出一个 patition。

3、写入流程

producer 的写入流程为,

  1. producer 先从 zookeeper 的 "/brokers/.../state" 节点找到该 partition 的 leader 
  2. producer 将消息发送给该 leader 
  3. leader 将消息写入本地 log 
  4. followers 从 leader pull 消息,写入本地 log 后 leader 发送 ACK 
  5. leader 收到所有 ISR 中的 replica 的 ACK 后,增加 HW(high watermark,最后 commit 的 offset) 并向 producer 发送 ACK

序列图如下,

4、producer delivery guarantee

kafka 提供三种方式,

  • At most once 消息可能会丢,但绝不会重复传输 
  • At least one 消息绝不会丢,但可能会重复传输 
  • Exactly once 每条消息肯定会被传输一次且仅传输一次

当 producer 向 broker 发送消息时,一旦这条消息被 commit,由于 replication 的存在,它就不会丢。但是如果 producer 发送数据给 broker 后,遇到网络问题而造成通信中断,那 Producer 就无法判断该条消息是否已经 commit。虽然 Kafka 无法确定网络故障期间发生了什么,但是 producer 可以生成一种类似于主键的东西,发生故障时幂等性的重试多次,这样就做到了 Exactly once,但目前还并未实现。所以目前默认情况下一条消息从 producer 到 broker 是确保了 At least once,可通过设置 producer 异步发送实现At most once。

二、broker 保存消息

1、存储方式

物理上把 topic 分成一个或多个 patition(对应 s

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值