Java Kafka是具有依赖关系的消息的正确解决方案吗?

Java Kafka是具有依赖关系的消息的正确解决方案吗?,java,spring,apache-kafka,kafka-consumer-api,Java,Spring,Apache Kafka,Kafka Consumer Api,我们有依赖的消息。例如。假设我们有4条消息M1,M2,M1_update1,(应该只在处理M1之后处理),M3(应该只在处理M1,M2之后处理) 在这个例子中,只有M1和M2可以并行处理,其他的必须是顺序的。我知道Kafka主题的一个分区中的消息是按顺序处理的。但是我怎么知道M1,M2已经被处理,现在是时候将M1_update1和M3消息推送到主题了?对于这种用例,卡夫卡是正确的选择吗?任何见解都将不胜感激 Kafka被用作发布子消息系统,具有高度可扩展性和容错性 我相信,当你的信息相互依赖时,

我们有依赖的消息。例如。假设我们有4条消息M1,M2,M1_update1,(应该只在处理M1之后处理),M3(应该只在处理M1,M2之后处理)


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

Kafka被用作发布子消息系统,具有高度可扩展性和容错性


我相信,当你的信息相互依赖时,单独使用卡夫卡可能是一个糟糕的选择。您需要的处理是基于条件的,您可能需要一个路由引擎(如camel或drool)来实现最终结果。

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


就相互依赖的消息而言,这需要一个核心卡夫卡本身不提供的逻辑层。如果我理解正确,并且处理发生在从卡夫卡消费消息之后,您将需要消费者端的某种通知,它将接收并处理
M1
M2
,并以某种方式通知另一端的制作人,现在可以发送
M1\u update
M3
。这绝对超出了卡夫卡的核心内容。您仍然可以使用Kafka来构建类似的内容,但可能还有其他更适合您的解决方案。

使用相同的分区键,我仍然可以对消息M1,M1_update1进行排序。然而,我仍然不确定如何为M3设计一个键(比如复合键m1_m2?),以便它进入正确的分区并按顺序自然处理。我们能否通过不止一个卡夫卡主题来实现这一点,并以某种方式在不同主题的消费者之间添加排序逻辑?我是卡夫卡的新手,所以我想了解一下它的可能性,目前我们正在使用依赖关系图(使用一些同步的集合等)在内存中的java中实现这种逻辑,并且能够在多个线程中处理消息。这是一个有趣的问题。我们有一个类似的用例,其中消息分为两个语义组。在组内,顺序是不相关的,但组之间存在顺序依赖关系,具体取决于实际消息。我认为,从可伸缩性的计算角度来看,如何将消息分成两组可能是一个糟糕的设计决策。我们试图对我们的问题找到一个更好的观点,这样我们就可以利用流来实现可伸缩性。这意味着生产者必须决定哪些消息需要严格排序,并且必须将这些消息推送到同一分区。。这个决定是计算密集型的,我们还不知道如何放大它。