从多个Kafka主题消费消息的最佳实践是什么?

8

我需要从不同的kafka主题中消费消息,

  1. 我应该为每个主题创建不同的消费者实例,然后根据分区数启动新的处理线程。 或者
  2. 我应该从单个消费者实例订阅所有主题,然后启动不同的处理线程。

谢谢 & 祝好, Megha

2个回答

10
唯一的规则是你必须考虑到 Kafka 对于什么有保证,以及什么没有保证:
- Kafka 仅对于单个主题/分区保证消息顺序。编辑:这也意味着如果你单个主题的消费者由于某种原因切换了分区,你可能会得到乱序的消息。 - 当你使用单个消费者订阅多个主题时,该消费者会为每个请求的主题分配一个主题/分区对。 - 这意味着任何一个主题的传入消息顺序都是正确的,但你不能保证不同主题之间的顺序是按时间顺序排列的。 - 你也无法保证在任何给定时间段内从任何特定订阅的主题中获取到消息。
我最近遇到了一个问题,因为我的应用程序使用单个消费者订阅了许多主题。每个主题都是一个每条消息一个图像的实时源。由于所有主题总是有新的图像,每次调用 poll() 时只返回来自第一个注册主题的图像。
如果处理所有消息很重要,你需要确保每个消费者可以比消息创建更快地处理其订阅的所有主题的消息。如果不能,你要么需要更多消费者在同一组中提交读取,要么你必须接受一些消息可能永远不会被处理的事实。
显然,一个消费者/主题是最简单的,但它确实增加了一些额外的开销。你需要根据自己的需求来确定这是否重要。
正确回答你的问题的唯一方法是评估你的应用程序的具体要求和能力,并构建符合这些要求并在 Kafka 的限制范围内工作的东西。

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

这也取决于您需要的容错能力,即您想要拥有哪些消费者组。 - Matthias J. Sax
我有大量的主题,例如2000个,1.每个主题创建一个消费者实例是否可行?2.如果每个主题有单独的消费者组或多个主题在同一消费者组中,会对其产生什么影响? - Megha
  1. 如果我没记错的话,每个消费者实例对应多个主题可能会提高吞吐量,因为消费者与代理之间的通信开销较小,重新平衡等方面的开销也较小。但这可能会导致更复杂的应用程序设计 - 可以考虑将“相似的主题”与一个消费者分组。
  2. 实际上并不重要,直到您想要为不同的主题/组具有不同的可扩展性要求(不同数量的分区等)。
- Alex Ott
1
我认为主要问题在于应用程序的语义/逻辑。其次是性能。拥有较少的消费者更好。但是,由于KafkaConsumer不是线程安全的,因此您应该每个线程拥有一个消费者。 - Matthias J. Sax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接