默认情况下,max.in.flight.requests.per.connection == 5
表示 Kafka 最多会并行向代理发送 5 条消息。如果这些消息并行进入同一分区,它如何管理顺序?
如果设置retries > 0
,Kafka 无法保证这些消息的顺序。
如果要获得排序保证,则需要将此值设置为max.in.flight.requests.per.connection == 1
。
Kafka 文档中对生产者配置retries
给出了解释:
允许重试而不将 max.in.flight.requests.per.connection 设置为 1 可能会更改记录的顺序,因为如果将两个批处理发送到单个分区,并且第一个批处理失败并重试,但第二个批处理成功,则第二个批处理中的记录可能会首先出现。
默认情况下,使用max.in.flight.requests.per.connection
> 1,可以对批处理进行重新排序。
如果要保证订购,可以:
-
设置
max.in.flight.requests.per.connection=1
.根据您的吞吐量,这可能会对性能产生重大影响。 -
通过将
enable.idempotence
设置为true
来使用幂等生产者。这样仍然可以利用max.in.flight.requests.per.connection=5
,但也强制实施批量排序。启用幂等性后,生产者会将序列号分配给所有批次,以便代理可以验证其订单。性能影响通常非常小。