1. 简单流程概述
A. 流程描述
a. producer先从zookeeper的"/brokers/.../state"节点找到该partition的leader
b. producer将消息发送给该leader
c. leader将消息写入到本地的log
d. follower从leader拉取消息,写入本地的log后向leader发送ack
e. leader收到ISR中的replica的ack后,增加HW(high watermark,最后commit的offset)并向producer发送ACK。
2. 消息发送的方式
Kafka的Producer发送消息采用的是异步发送的方式,且在新版的Kafka ApI中只有异步的发送方式。但是可以通过异步发送的API达到同步的效果。
3. Kafka发送消息的具体流程
在消息发送过程中,涉及到两个线程,以及一个线程共享变量-RecordAccumulator.
两个线程:
一是主线程,负责将消息进行封装和加工发送给消息中间件(RecordAccumulator)
二是send线程,负责从消息中间件中拉取数据发送到主题(Topic)的对应分区(Partition)
A. main线程
a.生产将要发送的数据封装成ProducerRecord对象,目的是发送到消息中间件
b.中间要经过拦截器列表、序列化器和分区器将消息发送到消息中间件
c.RecordAccumulator中有多个队列,与topic的分区相对应。消息发送时直接发送到分区对应的RecordAccumulator队列中
B. sender线程
a.当RecordAccumulator中攒够一批数据后,即达到指定量的数据之后,Sender线程将这一批数据拉取并发送给Topic。
控制参数:batch.size=>只有数据积累到batch.size之后,sender才会发送数据。
b.同时,如果RecordAccumulator中队列迟迟到不到指定量的数据时,会等到一定时长时发送。
控制参数:linger.ms=>如果数据迟迟未达到batch.size,sender等待linger.time之后就会发送数据
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。