赞
踩
原文网址:RabbitMQ高可用--Quorum Queue(仲裁队列)的原理_IT利刃出鞘的博客-CSDN博客
说明
本文介绍RabbitMQ的Quorum Queue(仲裁队列)的用法和原理。
RabbitMQ从3.8.0版本开始加入仲裁队列功能,它是镜像队列的替代方案。它有队列复制的能力,保障数据的高可用和安全性。使用仲裁队列可以在 RabbitMQ 节点间进行队列数据的复制,在一个节点宕机时队列仍然可以提供服务。
官网网址
https://www.rabbitmq.com/quorum-queues.html
相关网址
RabbitMQ高可用--Quorum Queue(仲裁队列)的用法_IT利刃出鞘的博客-CSDN博客
备注
RabbitMQ 已经有一个高可用队列的实现:镜像队列(Mirror Queues)。在 RabbitMQ 3.8.0 版本之前,镜像队列是实现数据高可用的唯一手段,但它有设计缺陷。仲裁队列旨在解决镜像队列的性能和同步问题。
使用场景
不适合使用的场景
Feature | Classic Mirrored | Quorum |
yes | no | |
yes | no | |
Per message persistence | per message | always |
Membership changes | automatic | manual |
yes | yes (since 3.10) | |
yes | yes | |
yes | yes (except x-overflow: reject-publish-dlx) | |
yes | always (since 3.10) or through the Memory Limit feature (before 3.10) | |
yes | no | |
yes | yes | |
yes | yes | |
Adheres to policies | yes | yes (see Policy support) |
Poison message handling | no | yes |
Global QoS Prefetch | yes | no |
Poison Message(有毒的消息)
这个是指消息一直不能被消费,就会导致消息不断的重新入队,这样这些消息就成为了毒消息。对于毒消息的处理,在经典队列中,可以通过设置入队次数上限的参数,将消息最终转入到死信队列处理,而在Quorum队列中,就有了更新的处理方式。
总结起来,仲裁队列可以提供更高的性能、更好的数据安全性、更容易进行节点的滚动升级。
这些特性在仲裁队列的第一个版本中不会提供
仲裁队列的磁盘和内存配置与普通队列不同。
普通队列
普通队列使用“共享”存储模型,对于一条要投递到多个队列的消息,只会存储一次,其他队列只会保存这条消息的引用。也就是说,在发布-订阅模型下,一条将要投递到多个队列的消息,它的存储大小不会随着投递到的队列变多而线性增长。
举个例子,我们用一个 fanout 类型的 exchange,绑定 10 个队列。这 10 个队列每个都设置 5个副本镜像队列。发布一条消息后,只有 5 条消息存储到集群中,每个节点存储 1 条。所以在这个情况下的写入放大是 5 倍。
仲裁队列
仲裁队列在内存中使用“共享”的存储模型,在磁盘中,每条消息都会分别被存储。所以发布-订阅模型会造成更严重的写入放大,可能导致更大的磁盘使用,甚至不得不放弃使用仲裁队列。
还是上面那个例子,当每个队列都变成仲裁队列,并且复制因子为 5 时,最终集群中的磁盘上存储了 50 条消息,每条消息的写入放大是 50 倍。
因此,把 fanout 交换器和仲裁队列一起使用不太合适。
仲裁队列的所有消息一直会保存在内存中,这会增加内存的使用量,最终可能导致集群不可用。如果不进行一些检查和监控,队列消息不断堆积,可能会导致生产停止(内存高水位),直到消息被消费或者从内存中删除。所以当使用仲裁队列时,设置队列的长度限制非常重要。此外还有必要用惰性队列作为仲裁队列的死信队列,通过死信交换器将这些消息转发到死信队列中。
因此,队列的规划和监控比普通场景更重要。下游(消费者和下游服务)的中断或者变慢可能导致多个队列消息堆积,需要有对应的规划和措施。你需要多少个仲裁队列、它们的写入速率时多少,当集群达到内存高水位时其他队列会不会收到影响?
如果仲裁队列超过半数的副本永久丢失,那么队列数据就永久丢失了。即便有小部分的副本仍然可用,队列仍然没有办法恢复,只能被强制删除。虽然这种场景出现的可能性较小,但是仍有这样的危险存在。所以,推荐使用可靠的磁盘,并且把复制因子设置为 5 ~ 3。
尽管仲裁队列的吞吐量更高,但是延迟也可能更高,这是由于使用了 Raft 协议。在仲裁队列中,所有消息都是持久化的,所有消息都会保存到每个副本的磁盘中。安全性是仲裁队列的主要目标。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。