整个流程涉及到main和sender两个线程main线程将数据发送到双端队列RecordAccumulator,Sender线程不断从RecordAccumulator中拉取消息发送到Broker。
- main线程中,数据经过拦截器。(生产环境中一般使用flume中的拦截器,因为配置更简单)
- 数据再经过序列化器(java自带的序列化太重了,这里使用Kafka自己的序列化器)
- 数据通过分区器确定分区后将数据发往RecordAccumulator。
- 数据在分区器中首先会查找是否有自己分区的Deque,有就返回,没有就创建一个并添加进去。
- 在Deque发送数据的基本单位是batch,每个batch大小默认16k当batch中数据达到16k或者时间达到linger.ms时间后,sender会从对应Deque中拉取数据发往Broker。这个发送请求会被缓存在Sender线程中的NetworkClient中,每个broker节点对应一个缓存队列,队列长度为5,也就是说每个broker节点最多缓存5个请求。发送成功的话,Deque会将NetworkClient中的缓存删除,然后将这个batch从Deque中删除。发送失败的话,sender会对这个发送请求进行重试(默认重试次数为int最大值,可以自定义)。