【问题标题】:How to guarantee order in Kafka partition如何保证Kafka分区中的顺序
【发布时间】:2018-01-15 22:25:38
【问题描述】:

好的,我知道您只能获得每个分区的订单保证。

只是随机的想法/问题。

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

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

【问题讨论】:

标签: apache-kafka kafka-producer-api


【解决方案1】:

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

生产者发送到特定主题分区的消息将按照发送顺序附加。也就是说,如果消息 M1 与消息 M2 由同一生产者发送,并且 M1 先发送,则 M1 将具有比 M2 更低的偏移量并更早出现在日志中。 http://kafka.apache.org/documentation.html#intro_guarantees

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      是的,生产者应该是单线程的。如果使用多个 Producer 线程生产到同一个分区,Consumer 的排序保证仍然会丢失。所以,同一个分区的排序保证也隐含地意味着一个 Producer 线程。

      【讨论】:

        【解决方案4】:

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

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

        对于异步类型,消息是通过批处理的方式发送的,也就是说,如果M1先于M2发送,则M1先在内存中累积,然后与M2相同。所以当生产者在单个请求中发送批量消息时,消息的顺序将得到保证。

        【讨论】:

          猜你喜欢
          • 2020-03-04
          • 2018-07-05
          • 2023-04-07
          • 1970-01-01
          • 1970-01-01
          • 2021-01-13
          • 2017-06-19
          • 2022-01-23
          • 1970-01-01
          相关资源
          最近更新 更多