6张图为你分析Kafka Producer 消息缓存模型

本文通过6张图详细解析Kafka Producer的消息缓存模型,包括Record Accumulator、消息批次ProducerBatch的内存管理、内存分配策略以及Batch的创建与释放过程。分析了Producer在Broker挂掉、客户端挂掉等情况下的消息处理方式,并探讨了创建ProducerBatch时的内存分配策略。
摘要由CSDN通过智能技术生成

在阅读本文之前, 希望你可以思考一下下面几个问题, 带着问题去阅读文章会获得更好的效果。

  1. 发送消息的时候, 当Broker挂掉了,消息体还能写入到消息缓存中吗?
  2. 当消息还存储在缓存中的时候, 假如Producer客户端挂掉了,消息是不是就丢失了?
  3. 当最新的Producer Batch还有空余的内存,但是接下来的一条消息很大,不足以加上上一个Batch中,会怎么办呢?
  4. 那么创建Producer Batch的时候,应该分配多少的内存呢?

什么是消息累加器Record Accumulator

kafka为了提高Producer客户端的发送吞吐量和提高性能,选择了将消息暂时缓存起来,等到满足一定的条件, 再进行批量发送, 这样可以减少网络请求,提高吞吐量。

而缓存这个消息的就是Record Accumulator类.

上图就是整个消息存放的缓存模型,我们接下来一个个来讲解。

消息缓存模型

上图表示的就是 消息缓存的模型, 生产的消息就是暂时存放在这个里面。

  1. 每条消息,我们按照TopicPartition维度,把他们放在不同的Deque<ProducerBatch> 队列里面。
    TopicPartition相同,会在相同Deque<ProducerBatch> 的里面。
  2. ProducerBatch : 表示同一个批次的消息, 消息真正发送到Broker端的时候都是按照批次来发送的,
    这个批次可能包含一条或者多条消息。
  3. 如果没有找到消息对应的ProducerBatch队列, 则创建一个队列。
  4. 找到ProducerBatch队列队尾的Batch,发现Batch还可以塞下这条消息,则将消息直接塞到这个Batch中
  5. 找到ProducerBatch队列队尾的Batch,发现Batch中剩余内存,不够塞下这条消息,则会创建新的Batch
  6. 当消息发送成功之后, Batch会被释放掉。

ProducerBatch的内存大小

那么创建ProducerBatch的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值