传递的消息数量不多,但需要对实体进行严格的消息排序。例如,我们可能有200万条消息,但是在200K实体上。如果实体的消息失败,则不应消耗后续消息,但可以消耗其他实体的消息。
使用Kafka,我们得到了分区的排序,但有一个限制,即如果分区中的消息没有被消耗,那么所有后续消息都将被阻止,即使它们属于另一个实体。我们可以增加分区数量,但这有一个限制。
解决这类问题的一般模式是什么?
答案 0 :(得分:1)
我希望我能正确理解这个问题,因为您希望确保某个实体的消息在仍具有可扩展解决方案的同时转到同一分区。
我认为最简单的方法是在生产者方面指定分区。
new ProducerRecord(topicName, partitionId,messageKey,message)
如果有问题的特定主题来自您的系统外部而您无法创建自己的生成器逻辑,我只需添加一个使用者,该消费者将消息生成到另一个主题,以便指定分区。
继续您的示例,假设您拥有包含数百万条消息和200k实体的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,所以我无法指定方法。
希望其他回答者可以提供一些额外的见解。