Architecture 消息排序和卡夫卡替代方案

Architecture 消息排序和卡夫卡替代方案,architecture,apache-kafka,message-queue,Architecture,Apache Kafka,Message Queue,传递的消息数量不多,但需要对实体上的消息进行严格排序。例如,我们可能有一百万条消息,但有20万个实体。如果某个实体的消息失败,则不应使用后续消息,但可以使用其他实体的消息 使用Kafka,我们可以获得分区上的排序,但有一个限制,即如果分区中的消息未被使用,则所有后续消息都将被阻止,即使它们属于另一个实体。我们可以增加分区的数量,但这是有限制的 解决这类问题的一般模式是什么 我希望我能正确理解这个问题,因为您希望确保某个实体的消息在仍然具有可伸缩解决方案的情况下进入同一分区 在我看来,最简单的方法

传递的消息数量不多,但需要对实体上的消息进行严格排序。例如,我们可能有一百万条消息,但有20万个实体。如果某个实体的消息失败,则不应使用后续消息,但可以使用其他实体的消息

使用Kafka,我们可以获得分区上的排序,但有一个限制,即如果分区中的消息未被使用,则所有后续消息都将被阻止,即使它们属于另一个实体。我们可以增加分区的数量,但这是有限制的


解决这类问题的一般模式是什么

我希望我能正确理解这个问题,因为您希望确保某个实体的消息在仍然具有可伸缩解决方案的情况下进入同一分区

在我看来,最简单的方法是在生产者端指定分区

new ProducerRecord(topicName, partitionId,messageKey,message)
如果所讨论的特定主题来自您的系统之外,因此您无法创建自己的生产者逻辑,那么我只需添加一个消费者,该消费者将生成另一个主题的消息,以便指定分区

继续您的示例,假设您有一个包含一百万条消息和200000个实体的\u主题,您可以有一个高吞吐量的消费者,它消费所有东西并生成某个\u主题\u 2,因此某个实体的消息始终生成到同一分区

然后,您可以使用另一个高通量消费者,它使用某个主题2中的内容,并执行您描述的逻辑,即跟踪哪些实体应该被忽略,并处理其他实体

当然,如果您不需要高吞吐量系统,您可以使用带有单个分区的kafka主题,并使用该主题的单个使用者进行所有处理

相关博客帖子:

其他想法:

如果您至少使用了kafka 0.10,那么另一种方法应该是使用kafka流

[…]能够维护状态为复杂的流处理应用程序提供了许多可能性:您可以加入输入流,或者对数据记录进行分组和聚合

不幸的是,我还没有使用Kafka Streams API,所以我无法指定一种方法


希望其他回答者能够提供一些额外的见解。

如果您想跳过某条消息,您仍然可以忽略该消息,以便以后处理。如果您更改了决定,您可以记住消息偏移量,然后再查找该偏移量以稍后处理消息。正如@MatthiasJ.Sax所说的,您可以在需要时跳过有问题的消息。因此,所有后续消息都将被阻止的假设是错误的。也许你需要用更多的细节来更新你的问题,比如你在下面的评论中添加了什么?抱歉没有提供足够的信息。因为如果我将消息边线化,则实体需要排序,因此这些实体的后续消息也需要边线化。正如@ossu54所建议的那样,我可以跟踪有问题的实体,每次我使用一条消息时,我都可以对照此列表进行检查,并决定是否进行处理。在对ossu54回答的评论中看到我对这一点的担忧。它是否澄清了miguno和Matthias J.Sax谢,我想我的问题略有不同。在consumer for some_topic_2中,我必须记录哪些实体需要被忽略,这样我就可以转到其他不相关但恰好位于同一分区中的实体。我需要将这些数据存储在某个地方,并检查每个增加开销的实体。假设我创建了一百万个分区,那么我就不会有这个问题,但是分区的数量是有限的。我可以在redis中为每个实体使用一个排序集,这样一个实体的故障不会影响其他实体。你认为这是一种考虑的方法吗?