如何在同一线程内对第二个 Kafka 消费者成功执行轮询?

How to successfully perform poll on second Kafka consumer within the same thread?

我有两个 Kafka 消费者,订阅了不同的主题并属于同一个消费者组,具有不同的消费者 ID,运行在同一个线程中。他们按顺序执行轮询,但在第一个完成后,第二个似乎陷入了轮询。 我尝试将它们与不同的消费者群体联系起来,这似乎很有效,但不幸的是,这对我来说不是一个可行的解决方案。

我在 "Kafka: The Definitive Guide" 中找到了这个:

You can’t have multiple consumers that belong to the same group in one thread and you can’t have multiple threads safely use the same consumer. One consumer per thread is the rule.

由于我需要执行特定的消息处理顺序,该引用将我引向某种形式的线程合作。

有人可以解释一下为什么有必要 运行 属于同一消费者组的不同消费者在不同的线程中订阅不同的主题吗?

谢谢。

来自 Kafka 用户邮件列表的解释

Matthias J. Sax:“为什么它会阻塞?嗯,在第一个消费者调用 poll() 之后,它会 加入群组,群组将有 1 名成员。当第二个 消费者调用 poll() 它将尝试加入该组。经纪方 组协调员知道组中已经有一个消费者并且 它会等到第一个消费者说“我还在这里并且仍然 组的一部分”——然而,这永远不会发生,因为第一个 消费者会通过调用 poll() 来做到这一点,但它不能,因为 第二个消费者被困在自己的 poll() 调用中以实际加入 团体。最终第一个消费者会超时并被移除 该组和第二个消费者解锁(该组还有一个 仅限会员)。之后第一个消费者将重试加入 组……等等等等。这个乒乓球比赛将永远持续下去……