如何使用RabbitMQ仲裁队列进行数据复制



RabbitMQ文档中提到:

RabbitMQ代理运行所需的所有数据/状态被复制到所有节点。这方面的一个例外是消息队列,它默认驻留在一个节点上,尽管从所有节点都可以看到和访问它们。若要跨集群中的节点复制队列,请使用支持复制的队列类型。此主题在仲裁队列指南中介绍。

如果我们正在使用springboot amqp经典队列,我们需要开始使用RabbitMQ集群,其中数据跨节点复制以降低数据丢失的风险,需要对代码进行哪些更改才能开始使用仲裁队列?

在定义队列时,默认类型为经典队列,要选择仲裁类型,只需将队列类型作为参数添加:

@Bean
public Queue eventsQueue() {
Map<String, Object> args = new HashMap<>();
args.put("x-queue-type", "quorum");
return new Queue(queueName, true, false, false, args);
}

除了上述内容之外,请确保您将spring引导兔子mq指向集群,而不是指向一个节点。这可以通过在应用程序中更改spring.rabbitmq.host配置来实现。属性到spring.rabbitmq。地址=[逗号分隔的ip:port]

Classic Queue在集群中的某个节点上运行主队列,而在其他节点上运行镜像队列。这与Quorum Queues的工作方式非常相似,默认情况下,leader在创建它的客户端应用程序连接到的节点上运行,follower在集群中的其余节点上创建。在过去,队列的复制是通过与经典队列一起使用策略来指定的。仲裁队列的创建方式不同,但应该与所有允许您在声明队列时提供参数的客户端应用程序兼容。在创建队列时,需要为x-queue-type参数提供quorum值。

相关内容