【问题标题】:How to guarantee order in Kafka partition如何保证Kafka分区中的顺序
【发布时间】:2018-01-15 22:25:38
【问题描述】:
好的,我知道您只能获得每个分区的订单保证。
只是随机的想法/问题。
假设分区策略是正确的,并且消息被正确分组到正确的分区(甚至说我们使用 1 个分区)
我认为生产应用程序必须将每条消息一一发送给 kafka,并确保在发送下一条消息之前已确认每条消息对吗?
【问题讨论】:
标签:
apache-kafka
kafka-producer-api
【解决方案2】:
一条一条同步发送消息(肯定很慢!),
或使用max.in.flight.requests.per.connection = 1 异步发送消息
【解决方案3】:
是的,生产者应该是单线程的。如果使用多个 Producer 线程生产到同一个分区,Consumer 的排序保证仍然会丢失。所以,同一个分区的排序保证也隐含地意味着一个 Producer 线程。
【解决方案4】:
在 kafka 中发送消息有两种策略:同步和异步。
对于同步类型,直观上是生产者将消息一一发送到目标分区,从而保证消息的顺序。
对于异步类型,消息是通过批处理的方式发送的,也就是说,如果M1先于M2发送,则M1先在内存中累积,然后与M2相同。所以当生产者在单个请求中发送批量消息时,消息的顺序将得到保证。