好的,所以我知道你只能获得每个分区的订单保证。
随机思考/问题。
假设分区策略正确并且消息正确分组到正确的分区(或者甚至说我们使用的是1分区)
我认为生产应用程序必须逐条地将每条消息发送给kafka,并确保在发送下一条消息之前已经确认每条消息都已被确认?
答案 0 :(得分:8)
是的,你是正确的,生产应用程序发送消息的顺序决定了它们存储在分区中的顺序。
生产者发送到特定主题分区的消息将按照发送顺序附加。也就是说,如果消息M1由与消息M2相同的生产者发送,并且首先发送M1,则M1将具有比M2更低的偏移并且在日志中更早出现。 http://kafka.apache.org/documentation.html#intro_guarantees
但是,如果您同时在飞行中有多条消息,我不确定如何确定订单。
您可能还想考虑生产者的acks
配置。如果领导者在M1发布并且新领导者收到M2之后出现故障,则可能会丢失消息。在这种情况下,您不会出现无序状况,但会丢失消息,因此它与您的原始问题略有正交,但如果消息保证和订单对您的应用程序至关重要,则需要考虑。
http://kafka.apache.org/documentation.html#producerconfigs
总的来说,设计一个系统,在这个系统中,顺序上的微小差异并不重要,这可以真正简化事情。
答案 1 :(得分:4)
逐个同步发送消息(绝对慢!),
或者使用max.in.flight.requests.per.connection = 1
答案 2 :(得分:0)
是的,Producer应该是单线程的。如果使用多个Producer线程生成到同一个分区,则Consumer上的排序保证仍将丢失。因此,隐式地对同一分区的排序保证也意味着单个Producer线程。
答案 3 :(得分:0)
在kafka中发送邮件有两种策略:同步和异步。
对于同步类型,直观地说,生产者将消息逐个发送到目标分区,从而保证消息顺序。
对于异步类型,使用批处理方法发送消息,也就是说,如果在M2之前发送M1,则M1首先在内存中累积,然后与M2相同。因此,当生产者在单个请求中发送批量消息时,将保证消息顺序。