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:
-
messages 1,2,3,4 are sent to the broker
-
message 1 is successfully acked by the broker
-
the broker hangs, causing the request timeout to kick in for message 2 that is in-flight
-
messages 2,3,4 are re-inserted on the producer queue
-
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
-
the broker comes up again
-
producer sends messages from producer queue to the broker: 3,4
-
the broker expected message 2, not 3, so returns an OutOfOrderSequence error
-
producer receives the error and raises a fatal exception
开启幂等时,生产者将设置acks = all,retries = Integer.MAX_VALUE和max.inflight.requests.per.connection = 1。推荐配置,不要被覆盖
查看kafka配置日志,创建时会打印,发现max.inflight.requests.per.connection = 5