当前位置: 首页 > java >正文

RabbitMQ 之仲裁队列

1. 问题引入

在日常开发中,通常会在集群中部署 RabbitMQ 服务,而不是使用单机程序。在集群模式下,就造成了数据不同步的问题。

现有三台机器组成了一个集群模式,并且均部署了 RabbitMQ 服务。现声明一个普通队列,主节点为 rabbit,如下图所示:

向这个队列中发送一条消息,由于这三台机器构成了一个集群,那么每一台机器都能访问这个队列,如图所示:

当我们停止 rabbit 服务后,观察另外两个服务,发现这个队列中的消息全都不见了,并且队列也处于无法访问的阶段,如下图所示:

那么在这种情况下,就会造成数据丢失,影响服务进行。于是,就需要引入仲裁队列。

2. 什么是仲裁队列

仲裁队列是基于 Raft 一致性算法实现的持久化、复制的 FIFO 队列。仲裁队列提供队列复制的能力,保障数据的高可用性与安全性,使用仲裁队列可以在节点间进行数据复制,从而达到在一个节点宕机时,队列数据不丢失,依然可以提供服务。

3. 使用仲裁队列

在 RabbitMQ 客户端中创建仲裁队列,如下图所示:

这里选择 rabbit2 作为主节点,队列创建成功后如下图所示:

使用 amqp-client 创建,代码如下:

Map<String, Object> param = new HashMap<>();
param.put("x-queue-type", "quorum");
channel.queueDeclare("quorum_queue",true,false,false,param);

 使用 spring 框架创建,代码如下:

@Configuration
public class RabbitMQConfig {/*** 创建仲裁队列* @return*/@Bean("quorumQueue")public Queue quorumQueue() {return QueueBuilder.durable(Constants.QUORUM_QUEUE).quorum().build();}
}

使用 quorum() 方法表示声明的队列为仲裁队列。

生产者代码如下:

    @RequestMapping("/quorum")public String quorum() {String message = "quorum ...";rabbitTemplate.convertAndSend("", Constants.QUORUM_QUEUE, message);return "消息发送成功";}

代码运行后,观察 RabbitMQ 客户端:

该仲裁队列是以 rabbitmq 为主节点,并且队列中已经有一条消息。

现在将 rabbitmq 服务终止,观察队列以及队列中的消息是否存在:

 

现在 rabbitmq 服务已经停止

 

队列依然存在,队列中的消息也依然存在,并且由于主节点宕机,根据 Raft 算法重新选举了 rabbit3 作为主节点。

从上面的测试结果中可以看出,使用仲裁队列后可以有效防止集群中某个节点宕机导致消息丢失。 

http://www.xdnf.cn/news/15287.html

相关文章:

  • 决策树的相关理论学习
  • 慢慢理解this
  • Dify离线安装包-集成全部插件、模板和依赖组件,方便安可内网使用
  • Matlab批量转换1km降水数据为tiff格式
  • 业务访问控制-ACL与包过滤
  • Qt窗口:QToolBar、QStatusBar、QDockWidget、QDialog
  • vue3 ref vs reactive值的修改
  • es里为什么node和shard不是一对一的关系
  • Git 使用笔记
  • 使用Starrocks替换Clickhouse的理由
  • SPSSPRO:数据分析市场SaaS挑战者的战略分析
  • 香港服务器Python自动化巡检脚本开发与邮件告警集成
  • 【Linux】线程机制深度实践:创建、等待、互斥与同步
  • 网络协议学习思维导图
  • python爬取新浪财经网站上行业板块股票信息的代码
  • java进阶(二)+学习笔记
  • 【算法】递归、搜索与回溯
  • Datawhale AI 夏令营2025科大讯飞AI大赛<夏令营:用AI做带货视频评论分析>
  • [Nagios Core] CGI接口 | 状态数据管理.dat | 性能优化
  • jenkins部署前端vue项目使用Docker+Jenkinsfile方式
  • 【星闪】Hi2821 | SDK开发入门,应用启动流程,创建自己的应用
  • 大模型聊天模板
  • 在人工智能自动化编程时代:AI驱动开发和传统软件开发的分析对比
  • AI 助力:如何批量提取 Word 表格字段并导出至 Excel
  • Infoblox NetMRI 远程命令执行漏洞复现(CVE-2025-32813)
  • C++值类别与移动语义
  • GraphRAG Docker化部署,接入本地Ollama完整技术指南:从零基础到生产部署的系统性知识体系
  • 动物世界一语乾坤韵芳华 人工智能应用大学毕业论文 -仙界AI——仙盟创梦IDE
  • 板凳-------Mysql cookbook学习 (十一--------9)
  • Typecho分类导航栏开发指南:从基础到高级实现