OutOfOrderSequenceException

本文解析了KafkaProducer出现OutOfOrderSequenceException的原因,并提供了详细的故障复现步骤及解决办法,建议配置包括开启幂等性、设置acks为all等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Kafka producer报错日志:

due to org.apache.kafka.common.errors.OutOfOrderSequenceException: The broker received an out of order sequence number.

at org.apache.kafka.streams.processor.internals.RecordCollectorImpl.recordSendError(RecordCollectorImpl.java:133)

at org.apache.kafka.streams.processor.internals.RecordCollectorImpl.access$500(RecordCollectorImpl.java:50)

at org.apache.kafka.streams.processor.internals.RecordCollectorImpl$1.onCompletion(RecordCollectorImpl.java:192)

at org.apache.kafka.clients.producer.KafkaProducer$InterceptorCallback.onCompletion(KafkaProducer.java:1288)

at org.apache.kafka.clients.producer.internals.ProducerBatch.completeFutureAndFireCallbacks(ProducerBatch.java:230)

at org.apache.kafka.clients.producer.internals.ProducerBatch.done(ProducerBatch.java:196)

at org.apache.kafka.clients.producer.internals.Sender.failBatch(Sender.java:715)

at org.apache.kafka.clients.producer.internals.Sender.failBatch(Sender.java:683)

at org.apache.kafka.clients.producer.internals.Sender.completeBatch(Sender.java:633)

at org.apache.kafka.clients.producer.internals.Sender.handleProduceResponse(Sender.java:555)

at org.apache.kafka.clients.producer.internals.Sender.access$100(Sender.java:74)

at org.apache.kafka.clients.producer.internals.Sender$1.onComplete(Sender.java:784)

at org.apache.kafka.clients.ClientResponse.onComplete(ClientResponse.java:109)

at org.apache.kafka.clients.NetworkClient.completeResponses(NetworkClient.java:557)

at org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:549)

at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:309)

at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:233)

at java.lang.Thread.run(Thread.java:813)

Caused by: org.apache.kafka.common.errors.OutOfOrderSequenceException: The broker received an out of order sequence number.

 

2.产生原因:

What happens, at a high level is:

  1. messages 1,2,3,4 are sent to the broker

  2. message 1 is successfully acked by the broker

  3. the broker hangs, causing the request timeout to kick in for message 2 that is in-flight

  4. messages 2,3,4 are re-inserted on the producer queue

  5. the partition timeout scanner runs (once per second) and sees that message 2 has timed out, removes message 2. Producer queue is now 3,4

  6. the broker comes up again

  7. producer sends messages from producer queue to the broker: 3,4

  8. the broker expected message 2, not 3, so returns an OutOfOrderSequence error

  9. producer receives the error and raises a fatal exception

 

3.解决方案:https://cwiki.apache.org/confluence/display/KAFKA/KIP-98+-+Exactly+Once+Delivery+and+Transactional+Messaging

开启幂等时,生产者将设置acks = all,retries = Integer.MAX_VALUE和max.inflight.requests.per.connection = 1。推荐配置,不要被覆盖

 

查看kafka配置日志,创建时会打印,发现max.inflight.requests.per.connection = 5

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值