【问题标题】:Is Kafka the right solution for messages with dependencies?Kafka 是具有依赖关系的消息的正确解决方案吗?
【发布时间】:2019-03-21 08:14:08
【问题描述】:

我们有相关的消息。例如。假设我们有4条消息M1,M2,M1_update1,(应该在M1处理完后处理),M3(应该在M1,M2处理完后处理)。

在这个例子中,只有 M1 和 M2 可以并行处理,其他的必须是顺序的。我知道 Kafka 主题的一个分区中的消息是按顺序处理的。但是我怎么知道 M1,M2 已处理,现在是时候将 M1_update1 和 M3 消息推送到主题了? Kafka 是这种用例的正确选择吗?任何见解表示赞赏!

【问题讨论】:

  • 这是一个有趣的问题。我们有一个类似的用例,其中消息分为两个语义组。组内的顺序无关紧要,但组之间存在顺序依赖关系,具体取决于实际消息。我认为从可扩展性的计算角度来看,我们如何将消息分成两组可能是一个糟糕的设计决策。我们试图对我们的问题找到更好的看法,以便我们可以利用流来实现可伸缩性。这意味着生产者必须决定哪些消息需要严格排序,并且这些消息必须推送到同一个分区。
  • 然而..这个决定是计算密集型的,我们还不知道如何扩大规模。

标签: java spring apache-kafka kafka-consumer-api


【解决方案1】:

Kafka 用作发布-订阅消息系统,具有高度可扩展性和容错性。

我相信当您的消息相互依赖时单独使用 kafka 可能是一个糟糕的选择。您需要的处理是基于条件的,您可能需要一个路由引擎,如骆驼或流口水来实现最终结果。

【讨论】:

  • 使用相同的分区键,我仍然可以对消息 M1、M1_update1 进行排序。但是,我仍然不确定,如何为 M3 想出一个密钥(如复合密钥 m1_m2?),以便它进入正确的分区并自然地按顺序处理。我们能否通过多个 Kafka 主题来实现这一点,并以某种方式在不同主题的消费者之间添加排序逻辑?我是 Kafka 的新手,所以试图了解可能性仅供参考,目前我们正在使用依赖图(使用一些同步集合等)在内存中的 java 中执行此逻辑,并且能够在多个线程中处理消息。
【解决方案2】:

您基本上是在描述一个保证排序的消息队列。根据设计,Kafka 保证排序,除非您提到的情况是主题具有单个分区。但是,在这种情况下,您并没有充分利用 Kafka 通过并行化分区中的数据来最大化吞吐量的能力。

就消息相互依赖而言,这将需要核心 Kafka 本身不提供的逻辑层。如果我理解正确,并且 处理 发生在从 Kafka 消费消息之后,您将需要在消费者端收到某种通知,它将接收和处理 M1M2 和以某种方式通知另一端的生产者,现在可以发送M1_updateM3。这绝对超出了 Kafka 提供的核心范围。你仍然可以使用 Kafka 来构建这样的东西,但可能还有其他更适合你的解决方案。

【讨论】:

    猜你喜欢
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    相关资源
    最近更新 更多