Kafka分区如何保证顺序

How to guarantee order in Kafka partition

好的,我了解到您只能获得每个分区的顺序保证。

随机thought/question.

假设分区策略正确并且消息被正确分组到正确的分区(甚至说我们正在使用 1 个分区)

我想生产应用程序必须将每条消息 1 条 1 条发送到 kafka,并确保在发送下一条消息之前每条消息都已被确认,对吗?

一条一条同步发送消息(绝对慢!),
或使用 max.in.flight.requests.per.connection = 1

批量异步发送消息

是的,您是正确的,生产应用程序发送消息的顺序决定了它们在分区中的存储顺序。

Messages sent by a producer to a particular topic partition will be appended in the order they are sent. That is, if a message M1 is sent by the same producer as a message M2, and M1 is sent first, then M1 will have a lower offset than M2 and appear earlier in the log. http://kafka.apache.org/documentation.html#intro_guarantees

但是,如果您同时发送多条消息,我不确定顺序是如何确定的。

您可能还想为您的制作人考虑 acks 配置。如果领导者在 M1 发布后出现故障并且新领导者接收 M2,则可能会丢失消息。在这种情况下,您不会遇到乱序情况,但会丢失一条消息,因此它与您的原始问题略有正交,但如果消息保证和顺序对您的应用程序至关重要,则需要考虑一些事情。 http://kafka.apache.org/documentation.html#producerconfigs

总的来说,设计一个顺序上的微小差异并不那么重要的系统可以真正简化事情。

是的,Producer 应该是单线程的。如果使用多个生产者线程生产同一个分区,消费者的顺序保证仍然是lost.So,同一个分区的顺序保证隐式也意味着一个生产者线程。

kafka有两种发送消息的策略:同步异步

对于同步类型,直观上是生产者一条一条的向目标分区发送消息,从而保证了消息的顺序。

对于异步类型,消息采用批处理的方式发送,也就是说如果M1先于M2发送,那么M1先在内存中积累,然后与M2相同。所以当producer在一次请求中批量发送消息时,消息的顺序就会得到保证。