KafkaProducer发送消息源码解析

Kafka发送消息整体归纳

  1. 入口KafkaProducer#doSend将消息按主题分区维护追加缓存区
  2. Sender线程从缓存区中取出符合要求的消息发送Broker中

KafkaProducer#doSend分析

总结KafkaProducer#doSend方法

  1. 获取topic的分区列表
  2. 序列化key
  3. 对消息内容进行序列化
  4. 根据分区负载算法计算本次消息发送该发往的分区
  5. 如果是消息头信息(RecordHeaders),则设置为只读
  6. 根据使用的版本号,按照消息协议来计算消息的长度
    —> 超过指定长度则抛出异常
  7. 先初始化消息时间戳,并对传入的 Callable(回调函数) 加入到拦截器链中
  8. 将消息追加到缓存区(重点)
  9. 针对各种异常,进行相关信息的收集

将消息追加到缓存区 RecordAccumulator#append

在这里插入图片描述
纵观 RecordAccumulator append 的流程,基本上就是从双端队列获取一个未填充完毕的 ProducerBatch(消息批次),然后尝试将其写入到该批次中(缓存、内存中),如果追加失败,则尝试创建一个新的 ProducerBatch 然后继续追加

将记录追加到当前记录集ProducerBatch#tryAppend

在这里插入图片描述

Sender#sendProducerData分析

总结Sender#sendProducerData方法

在这里插入图片描述

  1. 据上图所示,从缓存区RecordAccumulator中挑选已达到条件的数据,最终会封装成InFlightRequest对象,放在inFlightRequests集合
  2. selector.send(send)
    2.1 根据connectionId得到对应KafkaChannel
    2.2 将send赋值给KafkaChannel的send属性以及在注册写事件(查看NetworkClient#poll分析)
    在这里插入图片描述
    在这里插入图片描述

NetworkClient#poll

  1. 当写事件就绪后,就会将通道中的消息发送到远端的broker
    在这里插入图片描述
  2. 处理任何已完成的请求发送
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值