使用来自多个kafka主题的消息的最佳做法是什么?

时间:2017-10-08 08:16:07

标签: multithreading apache-kafka kafka-consumer-api

我需要消费来自不同kafka主题的消息,

  1. 我应该为每个主题创建不同的消费者实例,然后根据分区数启动新的处理线程。 或
  2. 我应该订阅来自单个消费者实例的所有主题,并且应该启动不同的处理线程
  3. 谢谢&问候, 梅加

2 个答案:

答案 0 :(得分:3)

唯一的规则是你必须考虑卡夫卡所做的事情,并不能保证:

  • Kafka仅保证单个主题/分区的消息顺序。编辑:这也意味着如果您的单个主题Consumer因某种原因切换分区,您可能会无序地收到消息。
  • 当您使用单个使用者订阅多个主题时,会为每个请求的主题分配一个主题/分区对。
  • 这意味着任何一个主题的传入消息的顺序都是正确的,但您不能保证主题之间的顺序是按时间顺序排列的。
  • 您也无法保证在任何特定时间段内您都会收到来自任何特定订阅主题的消息。

我最近遇到了一个错误,因为我的应用程序使用单个Consumer订阅了许多主题。每个主题是每个消息一个图像的实时图像馈送。由于所有主题始终都有新图像,因此每个poll()仅返回第一个主题中的图像进行注册。

如果处理所有消息很重要,您需要确保每个消费者可以比创建消息更快地处理来自其所有订阅主题的消息。如果它不能,那么您需要更多的消费者在同一组中进行读取,或者您必须对某些消息可能永远不会被处理这一事实感到满意。

显然,一个消费者/主题是最简单的,但它确实增加了一些额外消费者的开销。您必须根据自己的需要确定这一点是否重要。

正确回答问题的唯一方法是评估您的应用程序的特定要求和功能,并在Kafka的限制内构建适用于的内容。

答案 1 :(得分:1)

这实际上取决于您的应用程序的逻辑 - 它是否需要在一个地方一起查看所有消息。有时,根据应用程序的业务逻辑,单个主题的消费可能更容易实现。