RabbitMQ具有被动故障切换使用者的单个主动使用者

RabbitMQ具有被动故障切换使用者的单个主动使用者,rabbitmq,scalability,Rabbitmq,Scalability,我有一个可以水平缩放的API。API将确认客户端请求,并需要将工作分派到辅助系统。辅助系统需要以先到先服务的方式(队列)处理工作。此外,由于辅助系统正在访问可共享的资源,因此在给定时间,只有一个实例处于活动状态。辅助系统需要有故障转移机制。如果辅助系统的第一个实例发生故障,则需要另一个实例来代替它 我曾考虑使用RabbitMQ作为排队机制,让多个使用者连接,但只有一个活动使用者将处理工作。如果先前活动的消费者未能确认消息,则其他实例之一将承担处理消息的任务。RabbitMQ是否可以实现这一点 此

我有一个可以水平缩放的API。API将确认客户端请求,并需要将工作分派到辅助系统。辅助系统需要以先到先服务的方式(队列)处理工作。此外,由于辅助系统正在访问可共享的资源,因此在给定时间,只有一个实例处于活动状态。辅助系统需要有故障转移机制。如果辅助系统的第一个实例发生故障,则需要另一个实例来代替它

我曾考虑使用RabbitMQ作为排队机制,让多个使用者连接,但只有一个活动使用者将处理工作。如果先前活动的消费者未能确认消息,则其他实例之一将承担处理消息的任务。RabbitMQ是否可以实现这一点

此外,是否只有在作业完成后才能确认消息


谢谢。

在这种情况下,我建议通过队列复制消息,例如,如果一条消息有3个消费者,最好构建3个队列,然后通过交换机通过3个队列复制消息



此外,是否只有在作业完成后才能确认消息?

是的,您可以在代码中移动ack,在您的情况下,在消息细化之后。

这不可能直接使用RabbitMQ,这是您想要的方式

一个队列可以有多个使用者。但是,RabbitMQ将向任何可用于工作的使用者传递消息。换句话说,如果您有3个使用者,并且您向队列发送了3条消息,那么这些使用者中的每一个都可能会收到1条消息

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

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


请参阅RabbitMQ文档中的示例,了解使用确认的示例,以及向消费者发送循环消息的简要讨论。

由于尚未提及,因此在这种情况下可能会给您提供足够的信息。这取决于根据您的定义,未能确认消息的主要使用者是否等于RabbitMQ认为处于阻止状态的使用者。关于这一点还有更多的讨论。

这在RabbitMQ的新版本中是可能的:

谢谢您的回复。通过有3个消费者,他们所有人都将处理消息。我希望有一个消费者进行处理,如果主要消费者出现故障,其他消费者进行处理。我不明白。只有1个可以工作,另外2个只有“1”下降才能醒来?对吗?谢谢你,德里克。另一种选择是,我正在考虑将预回迁计数设置为1。据我所知,这将向消费者传递消息,并等待发送ack以传递队列中的下一条消息。这将保证在给定的时间内,所有消费者中只有一条消息被处理?预回迁计数将限制给定通道(基本上是消费者)中未确认消息的数量。如果您有3个消费者实例,且每个实例的预回迁值为1,则当前最多有3条消息正在处理。这在今天已不再正确,最好的答案现在来自deepak pundir。RabbitMQ有两个特性:单个活动使用者(SAC)和独占使用者。我推荐SAC。很抱歉在这里重复一个老问题,但我也确实遇到了这种情况,不知道您是否找到了解决这个问题的方法?卡尔