保证kafka顺序消息,很多人仅仅只知道将分区数置为1,这样做是有风险的。因为对于单个生产者发送消息是并行的,虽然也是有顺序控制,但是如果前面的消息发送失败,后面的消息发送成功,那么顺序一样也会错乱。
先来看看以下配置会出现什么样的情况:如果把 retires 设为非零整数,同时把 max.in.flight.requests.per.connection
设为比 1 大的数,当第一个批次消息写入失败,而第二个批次写入成功, broker会重试写入第一个批次。如果此时第一个批次也写入成功,那么消息的顺序可能产生如下的错乱。
2 -> 3 -> 4 -> 1
顺序消息保证消息被成功写入也是很关键的,所以不建议把 retires = 0
(不重试的话消息可能会因为连接关闭等原因丢失) 。
同时设置 max.in.flight.request.per.connection = 1
。这样在生产者尝试发送第一批消息时,就不会有其他的消息发送给 broker 。以上配置会严重影响生产者的吞吐量,所以只有在对消息的顺序有严格要求的情况下才能这么做。
要点如下:
- 保证当前Topic下只有一个Partition
- 生产者retires不为0,且
max.in.flight.requests.per.connection = 1