【问题标题】:How to use RabbitMQ quorum queue for data replication如何使用 RabbitMQ 仲裁队列进行数据复制
【发布时间】:2021-10-20 08:17:48
【问题描述】:
在 RabbitMQ 文档中,mentioned 是:
运行 RabbitMQ 代理所需的所有数据/状态都会在所有节点之间复制。一个例外是消息队列,默认情况下它们驻留在一个节点上,尽管它们对所有节点都是可见和可访问的。要跨集群中的节点复制队列,请使用支持复制的队列类型。 Quorum Queues 指南中介绍了该主题。
如果我们使用 springboot amqp 经典队列,并且我们需要开始使用 RabbitMQ 集群,其中数据跨节点复制以降低数据丢失的风险,那么需要对代码进行哪些更改才能开始使用仲裁队列?
【问题讨论】:
标签:
spring
spring-boot
rabbitmq
nodes
spring-amqp
【解决方案1】:
定义队列时,默认类型为经典队列,若要选择仲裁类型,只需添加队列类型作为参数即可:
@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 boot rabbit mq 指向集群而不是一个节点。这可以通过将 application.properties 中的 spring.rabbitmq.host 配置更改为 spring.rabbitmq.addresses=[逗号分隔的 ip:port]
来完成
经典队列有一个主节点在集群中的某个节点上运行,而镜像则在其他节点上运行。这与 Quorum Queues 的工作方式完全相同,默认情况下,领导者在创建它的客户端应用程序所连接的节点上运行,而追随者则在集群中的其余节点上创建。
过去,队列的复制是通过结合经典队列使用策略来指定的。仲裁队列的创建方式不同,但应与所有允许您在声明队列时提供参数的客户端应用程序兼容。创建队列时需要为 x-queue-type 参数提供值 quorum。