Spring-Kafka中如何并发使用多台服务器

How to use multiple servers concurrently in Spring-Kafka

我必须使用kafka作为队列,但想使用多个服务器进行并发处理,并且不应该接收重复的。例如,

P1 和 P2 正在将数据发送到消息分区 P。 C1、C2 和 C3 正在侦听分区 P,以便维持秩序。

在这种情况下,只有一个节点处于活动状态,这是一项耗时的工作,因此我们遇到了瓶颈。由于我们希望保持顺序,所以我们不想使用多个分区。

我目前的选择是将冗长的 运行 作业变为异步,这样它就可以完成最少的工作,剩下的留给异步。这在我们的用例中很难实现。

另一种选择是使用多个分区并手动处理排序,同样不是很可取。

最后的选择是将其作为主题,手动处理口是心非。

None 的选项是完美的,我想要的是使用像 spring-jms 共享主题连接,它注册所有订阅者但只将消息发送给其中的一个订阅者循环赛。这并不能保证严格的顺序,但我的测试仍然发现顺序比具有多个分区的kafka好得多。

请问您有什么建议吗?

嗯,这就是 Kafka 的工作方式。

同一consumer group中的所有消费者都订阅了该主题,但只有其中一个可以消费。如果以某种方式失败,则重新平衡发生在代理上,并且该组中的其他一些消费者将从分区中选择事件流。

这样我们就可以达到 Kafka 性能的最佳消费。如果你的下游逻辑很慢,那已经不是 Kafka 的责任了。

因此,轮询 原始 Kafka 的消费是不可能的。

您可以通过将数据转移到其他消息传递代理来真正实现这一点。相同的 JMS 或 RabbitMQ。

借助 Spring 集成及其持久性 QueueChannel 支持,您也可以实现循环。

但恐怕 Apache Kafka 本身没有任何东西。 是的,Spring Kafka 不会违约并就此事引入任何内容。只是因为这样的做法会导致持续的再平衡。