RabbitMQ单个主动消费者带有被动故障转移消费者



我有一个可以横向缩放的API。API将确认客户端请求,并需要将工作分派到辅助系统。二级系统需要以先到先得的方式处理工作,即队列。另外,由于辅助系统正在访问可以共享的资源,因此在给定的时间内,它的一个实例只能是活动的。辅助系统需要有故障转移机制。如果辅助系统的第一个实例出现故障,则需要另一个实例代替它。

我正在考虑使用RabbitMQ作为排队机制,让多个消费者连接,但只有一个活动消费者来处理工作。如果先前活动的使用者未能确认消息,则其他实例之一将承担处理消息的工作。

是否有可能仅在作业完成后才确认消息?

谢谢。

这在RabbitMQ的新版本中是可能的:https://www.rabbitmq.com/consumers.html single-active-consumer

这在RabbitMQ中是不可能直接实现的。

一个队列可以有多个消费者。然而,RabbitMQ会将消息传递给任何可用的消费者。换句话说,如果您有3个消费者,并且您向队列发送了3条消息,那么这些消费者中的每一个都可能获得1条消息。

如果您确实需要消费者的主动/被动故障转移,您将需要使用另一个系统来管理和监视消费者的实例。

关于确认所做的工作:是的。通过将no_ack设置为true,将队列设置为确认模式。这将要求您确认来自消费者的每条消息。您可以保持消息直到工作完成,然后在工作完成时确认消息。

请参阅RabbitMQ文档中的工作队列示例,以获得使用确认的示例,以及对向消费者分发循环消息的简要讨论。

在这种情况下,我建议在队列上复制消息,例如,如果消息有3个消费者,则最好构建3个队列,并通过交换器在此3queue上复制消息。



此外,是否可能仅在作业完成后才确认消息?
是的,您可以在代码中移动ack,在您的情况下,在详细说明消息之后。

既然还没有提到,消费者优先级在这种情况下可能已经足够了。这取决于根据你的定义,主消费者无法确认消息是否等同于RabbitMQ认为处于阻塞状态的消费者。这里也有一些关于这个的讨论

最新更新