传递的消息数量不多,但需要对实体上的消息进行严格排序。例如,我们可能有一百万条消息,但是有20万个实体。如果实体的消息失败,则不应使用后续消息,但可以使用其他实体的消息。使用kafka,我们可以得到分区的顺序,但有一个限制,即如果分区中的消息没有被使用,那么所有后续消息都将被阻止,即使它们属于另一个实体。我们可以增加分区的数量,但这是有限制的。解决这类问题的通用模式是什么?
2hh7jdfx1#
我希望我能正确理解这个问题,因为您希望确保某个实体的消息转到同一个分区,同时仍然有一个可扩展的解决方案。最简单的方法(在我看来)是在producer端指定分区。
new ProducerRecord(topicName, partitionId,messageKey,message)
如果所讨论的特定主题来自您的系统之外,并且您不能因此创建自己的生产者逻辑,那么我只需要将产生消息的消费者添加到另一个主题中,以便指定分区。继续您的示例,假设您有一个包含数百万条消息和200000个实体的主题,您可以有一个高吞吐量的使用者,它消耗所有内容并生成某个主题2,因此某个实体的消息总是生成到同一个分区。然后,您可以使用另一个高吞吐量的使用者,该使用者使用某个主题2,并执行您描述的逻辑,即监视哪些实体应被忽略,并处理其他实体。当然,如果您不需要高吞吐量系统,您可以使用带有单个分区的kafka主题,并使用该主题的单个使用者来执行所有处理。相关博客:http://www.javaworld.com/article/3066873/big-data/big-data-messaging-with-kafka-part-2.html其他想法:如果您至少使用kafka 0.10,那么另一种方法应该是使用kafka流(http://kafka.apache.org/documentation/streams).[…]能够维护状态为复杂的流处理应用程序打开了许多可能性:您可以加入输入流,或者对数据记录进行分组和聚合。不幸的是,我还没有使用kafka streams api,所以我不能指定一种方法。希望其他的回答者能提供一些额外的见解。
1条答案
按热度按时间2hh7jdfx1#
我希望我能正确理解这个问题,因为您希望确保某个实体的消息转到同一个分区,同时仍然有一个可扩展的解决方案。
最简单的方法(在我看来)是在producer端指定分区。
如果所讨论的特定主题来自您的系统之外,并且您不能因此创建自己的生产者逻辑,那么我只需要将产生消息的消费者添加到另一个主题中,以便指定分区。
继续您的示例,假设您有一个包含数百万条消息和200000个实体的主题,您可以有一个高吞吐量的使用者,它消耗所有内容并生成某个主题2,因此某个实体的消息总是生成到同一个分区。
然后,您可以使用另一个高吞吐量的使用者,该使用者使用某个主题2,并执行您描述的逻辑,即监视哪些实体应被忽略,并处理其他实体。
当然,如果您不需要高吞吐量系统,您可以使用带有单个分区的kafka主题,并使用该主题的单个使用者来执行所有处理。
相关博客:http://www.javaworld.com/article/3066873/big-data/big-data-messaging-with-kafka-part-2.html
其他想法:
如果您至少使用kafka 0.10,那么另一种方法应该是使用kafka流(http://kafka.apache.org/documentation/streams).
[…]能够维护状态为复杂的流处理应用程序打开了许多可能性:您可以加入输入流,或者对数据记录进行分组和聚合。
不幸的是,我还没有使用kafka streams api,所以我不能指定一种方法。
希望其他的回答者能提供一些额外的见解。