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