kafka-生产者-发布消息
第一步:确定存储位置
producer 发送消息到 broker 时,会根据分区算法选择将其存储到哪一个 partition。其路由机制为:
1. 指定了 patition,则直接使用;
2. 未指定 patition 但指定 key,通过对 key 的 value 进行hash 选出一个 patition
3. patition 和 key 都未指定,使用轮询选出一个 patition。
第二步:发布消息
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
注:kafka 在 zookeeper 中(/brokers/.../state)动态维护了一个 ISR(in-sync replicas), ISR 里面的所有 replica 都跟上了 leader,只有 ISR 里面的成员才能选为 leader。
时序图:
第三步:消息传输机制
一般情况下存在三种情况:
1. At most once 消息可能会丢,但绝不会重复传输
2. At least one 消息绝不会丢,但可能会重复传输
3. Exactly once 每条消息肯定会被传输一次且仅传输一次
默认情况下是确保 At least once,可通过设置 producer 异步发送实现At most once。
理论上,producer 可以生成一种类似于主键的东西,保证幂等性,这样就做到了 Exactly once,但目前还并未实现。
如果我引用您的博文记录,没有指出,请求您的原谅。可以私信告诉我,我一定改正!
注:我写博文的目的主要是记录得失,若有什么误人子弟的地方,请多多见谅指正;