producer发布消息

1、写入方式

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

2、消息路由

    producer发送消息到broker时,会根据分区算法选择将其存储到哪一个Partition,

    其路由机制为:

    2.1 指定了patition,则直接使用

    2.2 未指定patition但指定key,通过对key的value进行hash 选出一个patition

    2.3 patition和key都未指定,使用轮询选出一个patition

3、写入流程

     3.1 producer先从zookeeper的''/brokers/.../state"节点找到该partition的leader

     3.2 producer将消息发送给该leader

     3.3 leader将消息写入本地log

     3.4 followers从leader pull消息,写入本地log后leader发送ack

     3.5 leader收到所有ISR中的replica的ACK后,增加HW(high watermark,最后commit的offset)并向procuder发送ACK

4、producer delivery guaranteeproducer 发送担保

     4.1 At most once 消息可能会丢,但绝不会重复传输

     4.2 At least one 消息绝不会丢,但可能会重复传输

     4.3 Exactly once 每条消息肯定会被传输一次且仅传输一次

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

原文地址:https://www.cnblogs.com/cherish010/p/9015029.html