max.in.flight.requests.per.connection保证顺序的实现

max.in.flight.requests.per.connection=1 可以保证的某个主题分区发送的绝对顺序,不会因为报错重试导致批次乱序

Sender 发送数据 逻辑模拟

while (true) {
    if (!ready(cluster)) { 
    	return;
    }
	dataList = accumulator.drain(cluster, node) // 发送之后再判断 mute 由于没有返回, 所以阻止取某个tp的下一批数据,否则取到了tp的下一批数据 也发出去了, 但是上一批数据报错了, 再重试就乱序了,  取的数据在max.request.size范围内
	for data in dataList:
	  mutePartition(data.tp)

	nioSend() // 异步发送,
}


nioResponse() { // 异步接收
	if (ex) {
	   if (canRtry()) {
		   accumulator.requeue(). // 加到first保证下次还是取到的这个请求
	   }			
	}
	unmutePartition
}


public xxx drain() {
  for tp in node:  // 遍历某个节点上的所有主题分区
    if mute(tp):
       continue
	queue = getDeque(tp) // tp 就是 主题分区
	batch =-queue.peekFirst() // 注意是peek
	boolean backoff = first.attempts() > 0 && first.waitedTimeMs(now) < retryBackoffMs; // 如果异常了重试,并且超过重试时间间隔就可以获取到当前批次数据, 否则获取不到
	if (backoff) return
    
    batch = queue.pollFirst()
    list.add(batch)
  
  return list;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

org.apache.kafka.clients.producer.internals.Sender#sendProducerData
在这里插入图片描述
drain 获取到了一批数据
在这里插入图片描述

org.apache.kafka.clients.producer.internals.Sender#completeBatch(org.apache.kafka.clients.producer.internals.ProducerBatch, org.apache.kafka.common.requests.ProduceResponse.PartitionResponse, long, long)
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值