使用场景
仲裁队列(Quorum Queue)是基于Raft一致性协议实现的一种新型的分布式消息队列,针对RabbitMQ的镜像模式设计。仲裁队列中的消息需要有集群中过半节点同意确认后,才会写入到队列中。
仲裁队列与镜像队列的差异
使用镜像队列,当生产者发送一条消息,主队列会将消息同步给镜像队列,所有的镜像队列都保存消息后,主队列才会向生产者发送确认。
仲裁队列的算法是基于Raft共识算法的一个实现。仲裁队列包含一个主副本和多个从副本,当生产者向主副本发送消息时,主副本会将消息同步给从副本,当超过半数的副本保存消息后,主副本才会向生产者发送确认。并且,主副本的选举也需要超过半数的副本同意,这会避免出现网络分区时队列元数据不一致。所以仲裁队列有更高的一致性。
配置方法
在声明队列时,将队列的“x-queue-type”参数设置为“quorum”。
以下为java示例
Map arguments = newHashMap<>();
arguments.put("x-queue-type", "quorum");
channel.queueDeclare("test_quorum_queue", true, false, false, arguments);
设置仲裁队列的长度
通过设置队列属性的方式可以限制仲裁队列的长度和在内存中保存的长度。
x-max-length:仲裁队列的最大消息数。如果超过则丢弃消息,或者发送到死信交换器。
x-max-length-bytes:仲裁队列的最大总消息大小(字节数)。如果超过则丢弃消息,或者发送到死信交换器。
x-max-in-memory-length:限制仲裁队列的内存中最大消息数量。
x-max-in-memory-bytes:限制仲裁队列的内存中的最大总消息大小(字节数)。