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)
在这里插入图片描述

`libkafka` 是 Kafka 客户端库之一,用于连接 Apache Kafka 集群并进行消息消费。`InitTKafkaSetup` 可能是指某个特定框架或库中的初始化函数,它配置了消费者以保证消息不丢失。 为了确保消费者在Kafka中获取消息时不丢失,你可以设置以下几个关键参数: 1. **自动偏移量提交**(Auto Commit offsets): 消费者应该定期地将当前消费的位置(offset)提交到Kafka服务器。如果客户端崩溃,可以从上次提交的位置继续消费,避免数据丢失。通过 `ConsumerConfig.AUTO_OFFSET_RESET_CONFIG` 设置为 "earliest" 或 "latest" 来指定在找不到初始位置时的行为。 ```python from kafka import ConsumerConfig config = { ConsumerConfig.AUTO_OFFSET_RESET_CONFIG: 'latest', # 使用最新的已提交偏移量开始消费 # 其他配置... } ``` 2. **分区平衡策略**(Partitioner and Replication Strategies): 如果有多个消费者订阅相同的主题,确保每个消息会被均匀分配到各个消费者。这可以通过适当配置分区器(Partitioner)来实现。 3. **确认应答**(Message Acknowledgement): 消费者在接收到消息后,需要向Kafka服务器发送确认应答(acknowledgement),表示消息已经成功处理。默认配置下,Kafka会等待一个超时时间未收到确认才认为消息未被接收。调整 `ConsumerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION` 以及 `linger.ms` 参数来控制这个过程。 4. **错误处理**(Error Handling): 确保消费者能够正确处理网络中断、重启等异常情况,并在恢复后从上次失败的地方继续。 ```python consumer.subscribe(..., on_assign=... on_unassign=...) # 注册回调函数处理可能出现的问题 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值