RabbitMQ高可用--Quorum Queue(仲裁队列)的原理
原文网址: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 版本之前,镜像队列是实现数据高可用的唯一手段,但它有设计缺陷。仲裁队列旨在解决镜像队列的性能和同步问题。
仲裁队列的特性
- 仲裁队列用 Raft 算法实现了持久的、复制的 FIFO 队列,更加专注于数据安全。
- 不会出现mirror queue出现的那样,两个节点件同一queue的数量落差很大的情况。
- Quorum队列中的消息要有集群中多半节点同意后,才会写到队列。这种队列类似于RocketMQ当中的Ledger集群,这种方式可以保证消息在集群内部不会丢失。
- Quorum queue到特定负载后,就不会继续接受新消息了。保持自身的平衡。
仲裁队列的使用场景
使用场景
- 队列长期存在
- 对容错、数据安全方面的要求比较高,能容忍响应慢些
- 不用持久化
不适合使用的场景
- 一些临时使用的队列:比如transient临时队列,exclusive独占队列,或者经常会修改和删除的队列
- 对消息低延迟要求高:一致性算法会影响消息的延迟
- 对数据安全性要求不高:Quorum队列需要消费者手动通知或者生产者手动确认
- 队列消息积压严重:如果队列中的消息很大,或者积压的消息很多,就不要使用Quorum队列。Quorum队列当前会将所有消息始终保存在内存中,直到达到内存使用极限。
仲裁队列和镜像队列的对比
Feature |
Classic Mirrored |
Quorum |
Non-durable queues |
yes |
no |
Exclusivity |
yes |
no |
Per message persistence |
per message |
always |
Membership changes |
automatic |
manual |
Message TTL (Time-To-Live) |
yes |
yes (since 3.10) |
Queue TTL |
yes |
yes |
Queue length limits |
yes |
yes (except x-overflow: reject-publish-dlx) |
Lazy behaviour |
yes |
always (since 3.10) or through the Memory Limit feature (before 3.10) |
Message priority |
yes |
no |
Consumer priority |
yes |
yes |
Dead letter exchanges |
yes |
yes |
Adheres to policies |
yes |
yes (see Policy support) |
Poison message handling |
no |
yes |
Global QoS Prefetch |
yes |
no |
Poison Message(有毒的消息)
这个是指消息一直不能被消费,就会导致消息不断的重新入队,这样这些消息就成为了毒消息。对于毒消息的处理,在经典队列中,可以通过设置入队次数上限的参数,将消息最终转入到死信队列处理,而在Quorum队列中,就有了更新的处理方式。
仲裁队列的优势
- 客户端不需要改变它们生产和订阅的方法,无需考虑队列类型。
- 唯一的区别就是在客户端定义队列的时候需要定义成仲裁队列(代码中添加相关属性)
- 被解决当节点重新上线时,不会丢数据(解决了镜像队列同步的问题)
- 主副本会直接从从副本中断的地方开始复制消息。复制的过程是非阻塞的,所以整个队列不会因为新的副本加入而收到影响。唯一的影响是网络使用率。
- 没有了同步问题,不仅让仲裁队列比镜像队列更可靠,同时,因为写入必须被超过半数的副本接受,所以不会因为脑裂而丢数据。
- Raft 协议比镜像队列的算法更有效率,可以提供更好的消息吞吐量。
总结起来,仲裁队列可以提供更高的性能、更好的数据安全性、更容易进行节点的滚动升级。
仲裁队列的劣势
特性更少
这些特性在仲裁队列的第一个版本中不会提供
- 非持久化消息
- 排它队列
- 队列/消息 TTL(超时时间)
- 一些规则(Policy)不可用,只有死信队列、队列长度限制可用
- 优先级
- 惰性队列
- 非全局的消息预取(Qos)
磁盘使用——写入放大
仲裁队列的磁盘和内存配置与普通队列不同。
普通队列
普通队列使用“共享”存储模型,对于一条要投递到多个队列的消息,只会存储一次,其他队列只会保存这条消息的引用。也就是说,在发布-订阅模型下,一条将要投递到多个队列的消息,它的存储大小不会随着投递到的队列变多而线性增长。
举个例子,我们用一个 fanout 类型的 exchange,绑定 10 个队列。这 10 个队列每个都设置 5个副本镜像队列。发布一条消息后,只有 5 条消息存储到集群中,每个节点存储 1 条。所以在这个情况下的写入放大是 5 倍。
仲裁队列
仲裁队列在内存中使用“共享”的存储模型,在磁盘中,每条消息都会分别被存储。所以发布-订阅模型会造成更严重的写入放大,可能导致更大的磁盘使用,甚至不得不放弃使用仲裁队列。
还是上面那个例子,当每个队列都变成仲裁队列,并且复制因子为 5 时,最终集群中的磁盘上存储了 50 条消息,每条消息的写入放大是 50 倍。
因此,把 fanout 交换器和仲裁队列一起使用不太合适。
消息一直在内存中
仲裁队列的所有消息一直会保存在内存中,这会增加内存的使用量,最终可能导致集群不可用。如果不进行一些检查和监控,队列消息不断堆积,可能会导致生产停止(内存高水位),直到消息被消费或者从内存中删除。所以当使用仲裁队列时,设置队列的长度限制非常重要。此外还有必要用惰性队列作为仲裁队列的死信队列,通过死信交换器将这些消息转发到死信队列中。
因此,队列的规划和监控比普通场景更重要。下游(消费者和下游服务)的中断或者变慢可能导致多个队列消息堆积,需要有对应的规划和措施。你需要多少个仲裁队列、它们的写入速率时多少,当集群达到内存高水位时其他队列会不会收到影响?
失去多数节点时队列不可用
如果仲裁队列超过半数的副本永久丢失,那么队列数据就永久丢失了。即便有小部分的副本仍然可用,队列仍然没有办法恢复,只能被强制删除。虽然这种场景出现的可能性较小,但是仍有这样的危险存在。所以,推荐使用可靠的磁盘,并且把复制因子设置为 5 ~ 3。
延迟
尽管仲裁队列的吞吐量更高,但是延迟也可能更高,这是由于使用了 Raft 协议。在仲裁队列中,所有消息都是持久化的,所有消息都会保存到每个副本的磁盘中。安全性是仲裁队列的主要目标。
RabbitMQ高可用--Quorum Queue(仲裁队列)的原理相关推荐
- RabbitMQ高可用--Quorum Queue(仲裁队列)的用法
原文网址:RabbitMQ高可用--Quorum Queue(仲裁队列)的用法_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍RabbitMQ的Quorum Queue(仲裁队列)的用法. 官 ...
- RabbitMQ 高可用集群搭建及电商平台使用经验总结
面向EDA(事件驱动架构)的方式来设计你的消息 AMQP routing key的设计 RabbitMQ cluster搭建 Mirror queue policy设置 两个不错的RabbitMQ p ...
- RabbitMQ学习系列(六): RabbitMQ 高可用集群
前面讲过一些RabbitMQ的安装和用法,也说了说RabbitMQ在一般的业务场景下如何使用.不知道的可以看我前面的博客,http://www.cnblogs.com/zhangweizhong/ca ...
- RabbitMQ高可用
RabbitMQ高可用 各种消息队列对比 使用推荐 RabbitMQ 高可用 普通集群模式 镜像集群模式 保证消息队列的幂等性(消息不被重复消费) 消息队列的可靠性传输 生产者丢失数据 RabbitM ...
- 企业私有云之rabbitmq高可用
默认openstack使用rabbitmq做信息队列,如果想是云高可用,那么需要对每个涉及的组件都进行高可用配置,本文主要介绍如何使用rabbitmq做高可用. 高可用的方法为: 1 2 通过 Erl ...
- RabbitMQ高可用集群搭建
RabbitMQ高可用集群搭建 摘要:实际生产应用中都会采用消息队列的集群方案,如果选择RabbitMQ那么有必要了解下它的集群方案原理一般来说,如果只是为了学习RabbitMQ或者验证业务工程的正确 ...
- RabbitMQ:使用Docker构建RabbitMQ高可用负载均衡集群
目录 一.构建RabbitMQ集群 1. 启动多个RabbitMQ节点 2. 加入集群 3. 配置镜像队列 二.HAProxy负载均衡 1. 安装HAProxy 2. 配置HAProxy 3. 启动 ...
- RabbitMQ 高可用集群搭建
RabbitMQ 高可用集群搭建 1 集群简介 1.1 集群架构 当单台 RabbitMQ 服务器的处理消息的能力达到瓶颈时,此时可以通过 RabbitMQ 集群来进行扩展,从而达到提升吞吐量的目 ...
- RabbitMQ 高可用之镜像队列
如果RabbitMQ集群只有一个broker节点,那么该节点的失效将导致整个服务临时性的不可用,并且可能会导致message的丢失(尤其是在非持久化message存储于非持久化queue中的时候).可 ...
- RabbitMQ+haproxy+keeplived 高可用负载均衡高可用镜像集群队列_01
文章目录 一.RabbitMQ 集群节点说明 二.服务器hosts文件统一修改 三.RabbitMQ 镜像集群队列搭建部署 一.RabbitMQ 集群节点说明 服务器IP hostname 节点说明 ...
最新文章
- JDK1.5官方下载_JDK5官方下载_JDK1.5API(chm)下载_JDK5APICHM中文参考下载_JDK1.5下载_JDK5下载...
- APP可临摹分层模板素材|可改善您的登录设计
- java 除以2_Java最快速的算出乘2 和除2的结果
- linux忘记管理员密码,如何登陆?
- golang面向对象思想和实现
- 工作占用了太多私人时间_私人时间
- 初始化和清理(垃圾回收器)
- 网络弱电工程办理签证注意九个方面
- 北京市城八区廉租住房和经济适用住房保障家庭收入、住房、资产标准已确定
- 制药企业计算机系统验证,制药行业计算机化系统验证与数据可靠性实施精要
- 基于arm嵌入式linux毕业设计,本科毕业论文--基于arm的嵌入式系统设计.doc
- android电视手柄游戏,为游戏而生 Android TV的秘密武器露真容
- 波导缝隙天线(二)[搬运]
- helm模板开发-流程控制、作用域、循环
- 中国化肥产业发展现状及趋势分析,化肥产能过剩情况得到缓解「图」
- php发送邮件功能(以QQ邮件为例)
- CPP全面总结(涵盖C++11标准)
- 企业怎么制作网站?怎么制作网站教程步骤
- 停不下来!程序员在GitHub上开源了一个自制表情包项目
- (转载)Everynes NES Hardware Specifications
热门文章
- 警告: A docBase inside the host appBase has been specified, and will be ignore
- 【优秀课设】基于OpenCV+MediaPipe的手势识别(数字、石头剪刀布等手势识别)
- LTE(4G) - NR(5G) EPS承载
- 瀑布模型(waterfall model)需求明确+严格顺序执行
- C# Winform Socket即时通讯
- Deepest Root(dfs深度优先遍历)
- php strpos注意问题坑,关于PHP中的strpos的问题
- Zabbix 报告缺少可用的交换空间主机 “Lack of free swap space”问题解决
- 声明式导航与编程式导航
- 中国移动发布物联网操作系统 OneOS