我有一个可以水平缩放的API。API将确认客户端请求,并需要将工作分派到辅助系统。辅助系统需要以先到先服务的方式处理工作,即队列。此外,由于辅助系统正在访问可以共享的资源,因此在给定时间内只能有一个实例处于活动状态。辅助系统需要具有故障转移机制。如果辅助系统的第一个实例宕机,则需要另一个实例来取代它。
我在考虑使用RabbitMQ作为排队机制,让多个消费者连接,但只有一个活跃的消费者来处理工作。如果先前活动的使用者未能确认消息,则其他实例中的一个将接管处理消息的工作。使用RabbitMQ可以做到这一点吗?
另外,是否可以仅在作业完成后确认该消息?
谢谢。
发布于 2019-12-02 19:10:59
这在RabbitMQ的新版本中是可能的:https://www.rabbitmq.com/consumers.html#single-active-consumer
发布于 2015-08-18 00:46:07
这在RabbitMQ中是不可能的,这是您想要的方式。
一个队列可以有多个消费者。但是,RabbitMQ会将消息传递给任何可以进行工作的消费者。换句话说,如果您有3个消费者,并且您向队列发送了3个消息,那么这些消费者中的每个都可能获得其中的1个消息。
如果您确实需要使用者的主动/被动故障转移,则需要使用另一个系统来管理和监视使用者的实例。
关于对正在完成的工作的认可:是的。通过将no_ack设置为true,将队列置于确认模式。这将要求您确认来自消费者的每条消息。您可以保留该消息,直到工作完成,然后在工作完成时确认该消息。
有关使用确认的示例,请参阅RabbitMQ文档中的worker queue示例,并简要讨论向消费者分发循环消息。
发布于 2015-08-17 23:22:58
在这种情况下,我建议通过队列复制消息,例如。如果一条消息有3个消费者,最好是构建3个队列,然后由交换器在这3个队列上复制消息。
另外,是否可以仅在作业完成后确认该消息?
是的,你可以在你的代码中移动ack,在你的例子中,在消息细化之后。
https://stackoverflow.com/questions/32053855
复制相似问题