Apache kafka Kafka使用者偏移提交检查,以避免提交较小的偏移
我们假设有一个消费者发送提交偏移量10的请求。 如果存在通信问题,并且代理没有收到请求,当然也没有响应。之后,我们有另一个消费者处理另一批,并成功提交了抵销20Apache kafka Kafka使用者偏移提交检查,以避免提交较小的偏移,apache-kafka,kafka-consumer-api,Apache Kafka,Kafka Consumer Api,我们假设有一个消费者发送提交偏移量10的请求。 如果存在通信问题,并且代理没有收到请求,当然也没有响应。之后,我们有另一个消费者处理另一批,并成功提交了抵销20 Q:我想知道是否有一种方法或属性可以处理,这样我们可以在提交偏移量20之前检查日志中的上一个偏移量是否已提交?您描述的场景只能在使用异步提交时发生 请记住,一个特定的TopicPartition只能由同一个ConsumerGroup中的单个使用者使用。如果您有两个使用者在阅读同一个TopicPartition,那么这是唯一可能的 如果他
Q:我想知道是否有一种方法或属性可以处理,这样我们可以在提交偏移量20之前检查日志中的上一个偏移量是否已提交?您描述的场景只能在使用异步提交时发生 请记住,一个特定的TopicPartition只能由同一个ConsumerGroup中的单个使用者使用。如果您有两个使用者在阅读同一个TopicPartition,那么这是唯一可能的
commitAsync
),则确实可能发生这种情况。设想以下场景,按时间顺序排列:
- 使用者读取偏移量0(后台线程尝试提交偏移量0)
- 提交偏移量0成功
- 使用者读取偏移量1(后台线程尝试提交偏移量1)
- 提交偏移量1失败,请稍后重试
- 使用者读取偏移量2(后台线程尝试提交偏移量2)
- 提交偏移量2成功
- 现在,如何处理(您正在尝试提交偏移量1?)
import java.util_
导入java.time.Duration
导入org.apache.kafka.clients.consumer.{ConsumerConfig,ConsumerRecord,KafkaConsumer,OffsetAndMetadata,OffsetCommitCallback}
导入org.apache.kafka.common.{KafkaException,TopicPartition}
导入collection.JavaConverters_
对象AsyncCommitWithCallback扩展应用程序{
//定义主题
val topic=“myOutputTopic”
//设置属性
val props=新属性()
props.put(ConsumerConfig.GROUP\u ID\u CONFIG,“AsyncCommitter5”)
put(ConsumerConfig.BOOTSTRAP\u SERVERS\u CONFIG,“localhost:9092”)
//[设置更多属性…]
//创建KafkaConsumer并订阅
val consumer=new KafkaConsumer[String,String](道具)
consumer.subscribe(列表(主题).asJavaCollection)
//初始化全局计数器
val atomicLong=新的atomicLong(0)
//消费信息
试一试{
while(true){
val记录=消费者投票(百万持续时间(1)).asScala
if(记录非空){
用于(数据例如printStackTrace()
}最后{
consumer.commitSync()
consumer.close()
}
类KeepOrderAsyncCommit扩展了OffsetCommitCallback{
//保持此回调实例的位置
val position=atomicLong.incrementAndGet()
覆盖def onComplete(偏移量:util.Map[TopicPartition,OffsetAndMetadata],异常:异常):单位={
//仅当没有其他提交增加全局计数器时重试
if(异常!=null){
if(position==atomicLong.get){
consumer.commitAsync(此)
}
}
}
}
}