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

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.lryc.cn/news/586964.html

相关文章:

  • C++进阶-多态2
  • 全星质量管理QMS软件系统——汽车零部件制造业数字化转型的质量管理中枢
  • Redis 基础详细介绍(Redis简单介绍,命令行客户端,Redis 命令,Java客户端)
  • axios拦截器
  • 牛客周赛 Round 100
  • duckdb和pyarrow读写arrow格式的方法
  • 1.1.1+1.1.3 操作系统的概念、功能
  • 新手向:使用Python构建高效的日志处理系统
  • 深入理解Java中的hashCode方法
  • 磁悬浮轴承控制全攻略:从原理到实战案例深度解析
  • Python自动化:每日销售数据可视化
  • 闲庭信步使用图像验证平台加速FPGA的开发:第十二课——图像增强的FPGA实现
  • java+vue+SpringBoo中小型制造企业质量管理系统(程序+数据库+报告+部署教程+答辩指导)
  • Git Commit Message写错后如何修改?已Push的提交如何安全修复?
  • NoSQL 介绍
  • 前端-CSS-day3
  • 20250713-`Seaborn.pairplot` 的使用注意事项
  • Spring Boot 安全登录系统:前后端分离实现
  • [Subtitle Edit] 语言文件管理.xml | 测试框架(VSTest) | 构建流程(MSBuild) | AppVeyor(CI/CD)
  • Augment AI 0.502.0版本深度解析:Task、Guidelines、Memory三大核心功能实战指南
  • 海豚远程控制APP:随时随地,轻松掌控手机
  • iOS高级开发工程师面试——关于优化
  • DMDIS文件到数据库
  • 基于springboot的大学公文收发管理系统
  • 求解线性规划模型最优解
  • 跨域中间件通俗理解
  • 【QT】使用QSS进行界面美化
  • 005_提示工程与工具使用
  • 用Python实现一个Windows计算器练习
  • 011_视觉能力与图像处理