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,但目前还并未实现。

 

引用参考博客:http://www.cnblogs.com/cyfonly/p/5954614.html

posted @ 2017-08-02 15:51  简笔话_Golden  阅读(231)  评论(0编辑  收藏  举报