我有一个可以水平缩放的API。 API将确认客户端请求,并且需要将工作分派给辅助系统。辅助系统需要以先到先得的方式处理工作,即队列。此外,由于辅助系统正在访问可共享的资源,因此在给定时间只有一个实例可以是活动的。辅助系统需要具有故障转移机制。如果辅助系统的第一个实例发生故障,则另一个实例需要取代它。
我在考虑使用RabbitMQ作为排队机制,并且有多个消费者连接,但只有一个活跃的消费者会处理这项工作。如果先前活动的消费者未能确认消息,则其他实例之一将处理处理消息的工作。 RabbitMQ可以实现吗?
还可以在作业完成后确认消息吗?
谢谢。
答案 0 :(得分:1)
使用RabbitMQ并不是你想要的方式。
您可以为单个队列拥有多个使用者。但是,RabbitMQ将向可以工作的任何消费者传递消息。换句话说,如果您有3个消费者,并且您向队列发送了3条消息,那么这些消费者中的每一个都可能会收到1条消息。
如果您确实需要为消费者进行主动/被动故障转移,则需要使用其他系统来管理和监控消费者的实例。
关于确认正在进行的工作:是的。将no_ack
设置为true
,将您的队列置于确认模式。这将要求您确认来自消费者的每条消息。您可以保留消息直到工作完成,然后在工作完成时确认消息。
请参阅RabbitMQ文档中的worker queue示例,了解使用确认的示例,以及有关向消费者发送循环消息的简要讨论。
答案 1 :(得分:0)
在这种情况下,我建议在队列上复制消息,例如。如果你有一个消费者有3个消费者,最好建立3个队列,并通过交换机在这个3queue上复制消息。
也可以在作业完成后才确认消息?
是的,你可以在你的代码中移动ack,在你的情况下,在详细说明之后。
答案 2 :(得分:0)
由于尚未提及,Consumer Priorities在这种情况下可能会给您足够的帮助。根据您的定义,这取决于主要使用方未能确认消息是否等于RabbitMQ认为处于阻塞状态的使用方。关于此here,还有更多讨论。
答案 3 :(得分:0)
这可以通过新发行的RabbitMQ实现: https://www.rabbitmq.com/consumers.html#single-active-consumer