我必须使用kafka作为队列,但是想要使用多个服务器进行并发处理,并且不应该接收重复项。例如,
P1和P2正在将数据发送到消息分区P. C1,C2和C3正在侦听分区P,以便维持秩序。
在这种情况下,只有一个节点处于活动状态,这是一项耗时的工作,因此我们遇到了瓶颈。由于我们希望维护订单,因此我们不想使用多个分区。
我目前的选项是将长时间运行的作业变为异步,以便它可以做到最低限度并为异步留下休息。在我们的用例中很难实现这一点。
另一个选择是使用多个分区并手动处理订购,再次不是很好。
最后一个选项是将其用作主题并手动处理双重性。
没有一个选项是完美的,我想要的是使用spring-jms可共享主题连接,它注册所有订阅者,但在循环中只向其中一个发送消息。这并不保证严格的顺序,但我的测试仍然发现比具有多个分区的kafka更好的排序。
你有什么建议吗?
答案 0 :(得分:0)
嗯,这就是卡夫卡的工作方式。
同一consumer group
中的所有消费者都订阅了该主题,但只有其中一个消费者可以使用。如果以某种方式失败,则重新平衡发生在代理上,组中的其他一些消费者将从分区中选择事件流。
通过这种方式,我们可以从卡夫卡表演中获得最佳消费。如果你的逻辑在下游缓慢,那已经不是卡夫卡的责任了。
因此,循环消耗是不可能的原始Kafka本质上。
您可以通过将数据转移到其他消息代理来实现这一目标。相同的JMS或RabbitMQ。
通过Spring Integration及其持久的QueueChannel
支持,您也可以实现循环抢夺。
但我担心Apache Kafka本身没有任何东西可以解决这个问题。 是的,Spring Kafka不会违反合同并在此问题上引入一些内容。仅仅因为这种方法会导致持续的再平衡。