【问题标题】:Message ordering and kafka alternatives消息排序和 kafka 替代方案
【发布时间】:2017-06-24 14:28:44
【问题描述】:

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

使用 Kafka,我们可以对分区进行排序,其限制是如果分区中的消息没有被消费,那么所有后续消息都将被阻止,即使它们属于另一个实体。我们可以增加分区的数量,但这有一个限制。

解决这类问题的通用模式是什么?

【问题讨论】:

  • 如果您想跳过一条消息,您仍然可以“使用”并忽略它——以供以后处理。如果你改变你的决定,你可以记住消息偏移量,然后#seek()到这个偏移量,以便以后处理消息。
  • 正如@MatthiasJ.Sax 所说——您实际上可以在需要时跳过有问题的消息。因此,“所有后续消息都将被阻止”是错误的假设。也许您需要用更多细节来更新您的问题,例如您在下面的评论中添加的内容?
  • 抱歉没有提供足够的信息。因为如果我将消息放在一边,实体需要排序,因此这些实体的后续消息也需要放在一边。正如@ossu54 建议的那样,我可以跟踪有问题的实体,并且每次我消费一条消息时,我都可以检查这个列表并决定是否处理。在对 ossu54 的回答的评论中看到我对此的担忧它是否澄清了 miguno 和 Matthias J. Sax

标签: architecture apache-kafka message-queue


【解决方案1】:

我希望我能正确理解这个问题,因为您希望确保某个实体的消息进入同一个分区,同时仍然具有可扩展的解决方案。

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

new ProducerRecord(topicName, partitionId,messageKey,message)

如果有问题的特定主题来自您的系统外部,因此您无法创建自己的生产者逻辑,我只需添加一个产生消息的消费者到另一个主题,以便指定分区。

继续您的示例,假设您有一些包含数百万条消息和 20 万个实体的 some_topic,您可能有一个高吞吐量的消费者,它消耗所有内容并生成到 some_topic_2,以便始终将某个实体的消息生成到同一个分区.

然后您可以使用另一个从 some_topic_2 消费并执行您描述的逻辑的高吞吐量消费者,即密切关注哪些实体应该被忽略并处理其他实体。

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

相关博文: http://www.javaworld.com/article/3066873/big-data/big-data-messaging-with-kafka-part-2.html

其他想法:

如果您至少使用 kafka 0.10,另一种方法是使用 Kafka Streams (http://kafka.apache.org/documentation/streams)。

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

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

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

【讨论】:

  • 谢谢,我想我的问题略有不同。在 some_topic_2 的消费者中,我必须密切关注哪些实体需要被忽略,以便我可以继续处理不相关但恰好位于同一分区中的其他实体。这些我需要存储在某个地方并检查每个实体是否增加了开销。假设我创建了一百万个分区,那么我就不会遇到这个问题,但是分区的数量是有限的。我可以在 redis 中为每个实体使用一个排序集,这样一个实体的故障不会影响其他实体。您认为这是一种需要考虑的方法吗?
猜你喜欢
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 2017-04-03
  • 2011-10-26
  • 2013-05-18
  • 1970-01-01
相关资源
最近更新 更多