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

Rabbitmq 镜像队列

RabbitMQ 支持高可用性队列(HA Queues),可以在多个节点之间复制队列,确保即使某个节点失败,消息仍然可用。将 RabbitMQ 部署为集群,确保高可用性和负载均衡。

RabbitMQ 的镜像队列集群(Mirrored Queues Cluster)是实现高可用性的一种模式,它通过在集群中的多个节点之间复制队列,确保消息在集群的某些节点宕机时不会丢失,并且队列仍然可以正常工作。镜像队列集群广泛用于需要保证消息可靠性的业务场景,如金融、支付、订单处理等关键任务。

在镜像队列集群中,队列的主副本(主队列)会存在于一个节点上,称为主队列节点(Master)。同时,这个队列会被复制到集群中的其他节点,这些副本称为镜像(Mirrors)。

核心工作机制

  • 主队列(Master Queue):
    • 队列的原始副本,所有的消息发布、消费、ACK 都是在主队列上处理的。
    • 每当有消息发送到主队列时,主队列会将消息同步到其镜像节点。
  • 镜像队列(Mirrored Queue):
    • 镜像队列是主队列的完全副本,存在于集群的其他节点上,会实时同步主队列中的所有消息和状态。这些镜像队列与主队列保持同步,以确保所有消息和状态在每个镜像中都相同。
    • 如果主队列所在的节点发生故障,集群中的其中一个镜像队列会自动提升为新的主队列,并继续提供服务。
  • 故障转移(Failover):
    • 当主队列的节点发生故障时,RabbitMQ 会自动从剩下的镜像队列中选择一个提升为主队列。此过程通常是无缝的,在故障转移期间,消费和生产可能会有短暂的中断,但当新的主队列节点被选定后,消息处理会恢复正常。消费者和生产者可以继续与新的主队列通信。
    • 故障转移后,新的主队列会自动在其他节点上创建新的镜像,以保持高可用性。
  • 镜像的自动管理
    • RabbitMQ 可以根据策略自动管理镜像队列的数量和分布。可以配置镜像策略,控制镜像队列的创建、复制的节点数量等。

镜像队列集群的配置
镜像队列集群的配置通常通过 策略(Policy) 来实现。可以通过 RabbitMQ 管理界面或命令行工具 rabbitmqctl 来定义镜像队列的策略。
使用 rabbitmqctl 命令创建一个策略,将队列的镜像复制到集群的所有节点上。

rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"all"}'
  • ha-all: 策略名称。
  • ^ha.: 队列名称的正则表达式,所有以 ha. 开头的队列都会应用此策略。
  • {“ha-mode”:“all”}: 表示所有节点都会有该队列的镜像。
  • ha-mode
    • all: 将队列镜像到集群中的所有节点上。
    • exactly: 将队列镜像到集群中的指定数量的节点上。
    • nodes: 选择特定的节点进行队列镜像。
  • ha-sync-mode:
    • automatic: 当新的镜像节点加入时,自动同步主队列中的消息到新镜像节点。
    • manual: 需要手动执行同步操作。

如果不希望将队列镜像到集群的所有节点,而是只希望将其复制到指定数量的节点,可以使用 ha-mode 的 exactly 选项。
假设有 3 个节点的 RabbitMQ 集群(节点 A、B、C),可以配置队列只在两个节点上进行镜像,如下:

rabbitmqctl set_policy ha-two "^ha\." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
  • 这会将所有以 ha. 开头的队列镜像到集群的任意两个节点上。
  • ha-mode: 使用 exactly 来指定镜像的数量。
  • ha-params: 表示该队列会被镜像到集群中两个节点上。
  • ha-sync-mode: 使用 automatic 模式,表示镜像队列会自动与主队列同步。

也可以选择将镜像队列只复制到特定节点上,通过 nodes 参数指定节点。

rabbitmqctl set_policy ha-nodes "^ha\." '{"ha-mode":"nodes","ha-params":["rabbit@node1","rabbit@node2"]}'
  • ha-mode: 使用 nodes 模式,将队列镜像到 rabbit@node1 和 rabbit@node2 上。

镜像队列会增加集群的网络带宽和存储开销,因为每一条消息都要在多个节点之间同步。应根据业务场景合理设置镜像的节点数量,平衡高可用性和性能。

优点:

  • 高可用性:当某个节点故障时,镜像队列可以迅速接管,确保队列和消息的可用性。
  • 无缝故障转移:RabbitMQ 会自动进行故障转移,无需额外的操作或维护。
  • 消息可靠性:通过在多个节点上同步队列和消息,确保了消息不会因为节点故障而丢失。

缺点:

  • 性能损耗:由于镜像队列需要同步消息和状态,增加了网络、磁盘和内存的负载,可能会影响消息处理的性能。
  • 配置复杂性:在集群规模增大时,需要考虑如何合理配置镜像策略,避免不必要的资源消耗;维护镜像队列集群需要更复杂的集群管理和监控,尤其是在节点数量增加时。
  • 分区问题:如果集群中存在网络分区,可能会导致队列数据不一致,镜像队列可能在不同分区中各自成为主队列,带来数据冲突问题。
  • 扩展性受限:随着集群中节点数量的增加,同步的负载会成倍增加,因此不适合非常大规模的集群。

Spring Boot 项目中配置镜像队列
在 Spring Boot 项目中配置 RabbitMQ 镜像队列(Mirrored Queues)进行消息的收发,需要在 RabbitMQ 中设置队列为高可用队列,并在 Spring Boot 应用中进行相应的配置。

镜像队列的核心特性是,消息会被复制到集群中的多个节点(主节点 + 副节点),从而实现高可用性。其工作原理如下:

  • 主节点(Master Node)负责处理所有入队和出队的操作。
  • 副节点(Mirror Node)仅同步主节点的数据,并在主节点不可用时,自动切换成为新的主节点。

当主节点挂掉后,RabbitMQ 会通过仲裁机制,自动选择一个副节点作为新的主节点。此时,消息消费者和生产者会自动与新的主节点进行通信,而无需手动更改配置。

在 Spring Boot 中,可以通过配置 RabbitMQ 的镜像队列集群,使应用程序在主节点宕机后自动切换到副节点。为此,最常见的做法是配置 RabbitMQ 的多个节点地址或使用一个负载均衡的 DNS 入口来实现故障切换。

使用多个节点地址 (addresses)
Spring Boot 提供了 addresses 配置项,可以指定多个 RabbitMQ 节点地址。当其中一个节点不可用时,应用程序会自动尝试连接其他节点,而无需手动修改配置文件。这是最简单和直接的方式来实现高可用性。

spring:rabbitmq:addresses: host1:5672,host2:5672,host3:5672  # 配置多个 RabbitMQ 集群节点port: 5672username: guestpassword: guestvirtual-host: /listener:simple:concurrency: 3max-concurrency: 10connection-timeout: 15000queues:- name: mirroredQueuedurable: trueexclusive: falseauto-delete: falsearguments:x-ha-policy: all

在这个配置中,addresses 通过逗号分隔的多个 host:port 配置,告诉 Spring Boot 的 RabbitMQ 客户端尝试连接多个节点。如果 host1 宕机,客户端会自动尝试连接 host2,然后是 host3。当其中某个节点不可用时,Spring Boot 会自动切换到下一个可用节点,避免手动修改配置文件。

如果 RabbitMQ 集群通过 DNS 提供了一个负载均衡的入口地址,可以使用该 DNS 入口来实现节点的自动切换。负载均衡 DNS 可以自动将请求路由到可用的 RabbitMQ 节点,并在节点故障时自动进行切换。

spring:rabbitmq:host: rabbitmq-cluster.example.com  # 指定 RabbitMQ 集群的负载均衡 DNS 名称port: 5672                          # RabbitMQ 默认端口username: guestpassword: guestvirtual-host: /listener:simple:concurrency: 5max-concurrency: 10connection-timeout: 15000

在这个配置中,host 被设置为 RabbitMQ 集群的 DNS 名称(例如 rabbitmq-cluster.example.com)。这个 DNS 名称应该指向 RabbitMQ 集群中的所有节点,并能够处理主节点宕机时的自动切换。

创建一个 RabbitMQ 配置类,配置高可用队列(镜像队列):

  • 当镜像队列被正确配置(如 x-ha-policy: all),消息会自动复制到副节点。
  • 当主节点故障时,副节点会被提升为新的主节点,继续处理消息的发送和消费。
  • Spring Boot 中的 RabbitMQ 连接使用 spring-rabbit 和 AMQP 协议库,它内置了自动重连机制,当连接的主节点宕机时,Spring Boot 应用程序会尝试重新连接到集群中的其他节点,重新建立连接。
@Configuration
@EnableRabbit
public class RabbitConfig {@Beanpublic Queue mirroredQueue() {// 创建一个高可用队列(镜像队列)return new Queue("mirroredQueue", true, false, false, Map.of("x-ha-policy", "all"));}
}

创建一个消息发送者,用于发送消息到镜像队列:

@Service
public class MessageProducer {@Autowiredprivate RabbitTemplate rabbitTemplate;public void sendMessage(String message) {rabbitTemplate.convertAndSend("mirroredQueue", message);System.out.println("Sent message: " + message);}
}

创建一个消息接收者,用于接收来自镜像队列的消息:

@Component
public class MessageListener {@RabbitListener(queues = "mirroredQueue")public void receiveMessage(String message) {System.out.println("Received message: " + message);}
}

监控:使用 RabbitMQ 管理插件或其他监控工具,监控队列的状态、消费者的处理情况和系统的性能指标。
告警:设置告警机制,当消息堆积或消费者处理速度缓慢时,及时通知相关人员。

相关文章:

Rabbitmq 镜像队列

RabbitMQ 支持高可用性队列(HA Queues),可以在多个节点之间复制队列,确保即使某个节点失败,消息仍然可用。将 RabbitMQ 部署为集群,确保高可用性和负载均衡。 RabbitMQ 的镜像队列集群(Mirrore…...

TensorBoard

1、TensorFlow的TensorBoard TensorBoard是TensorFlow的一个组件,它提供了一个交互式的界面,用于可视化TensorFlow程序的训练过程和模型结构。 使用TensorBoard,你可以: 可视化训练过程中的各种指标,如损失函数、准…...

运维实战:K8s 上的 Doris 高可用集群最佳实践

今天我们将深入探讨::如何在 K8s 集群上部署 Compute storage coupled(存算耦合) 模式的 Doris 高可用集群? 本文,我将为您提供一份全面的实战指南,逐步引导您完成以下关键任务: 配…...

2024.12.5——攻防世界Training-WWW-Robots攻防世界baby_web

2024.12.5—攻防世界Training-WWW-Robots 知识点:robots协议 dirsearch工具 本题与第一道Robots协议十分类似,不做wp解析 大致步骤: step 1 打开靶机,发现是robots协议相关 step 2 用dirsearch进行扫描目录 step 3 url传参r…...

当 Nginx 出现连接超时问题,如何排查?

文章目录 当 Nginx 出现连接超时问题,如何排查? 一、了解 Nginx 连接超时的基本概念二、可能导致 Nginx 连接超时的原因 (一)服务器负载过高(二)上游服务响应缓慢(三)网络问题&…...

vue2 项目中实现动态代理,服务器上通过nginx部署 实现动态代理

一、前言&&原理 前言:vue2 项目中,请求接口是从表格的当前获取的,也就是接口ip:端口号:路经不确定,要实现点击表格当前行请求对应的接口 实现原理:将实际要请求的ip等信息存在请求头中,用的时候再…...

基于SpringBoot+Vue的民宿山庄农家乐管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...

【数据分享】1901-2023年我国省市县三级逐年最低气温数据(Shp/Excel格式)

之前我们分享过1901-2023年1km分辨率逐月最低气温栅格数据和Excel和Shp格式的省市县三级逐月最低气温数据,原始的逐月最低气温栅格数据来源于彭守璋学者在国家青藏高原科学数据中心平台上分享的数据!基于逐月栅格数据我们采用求年平均值的方法得到逐年最…...

后端API接口设计标准(Java)

Controller 层(API接口) 无论是传统的三层架构还是现在的COLA架构,Controller 层依旧有一席之地,说明他的必要性;说它是配角是因为 Controller 层的代码一般是不负责具体的逻辑业务逻辑实现,但是它负责接收…...

网络安全法 -网络信息安全

第四章 网络信息安全 第四十条 网络运营者应当对其收集的用户信息严格保密,并建立健全用户信息保护制度。 第四十一条 网络运营者收集、使用个人信息,应当遵循合法、正当、必要的原则,公开收集、使用规则,明示收集、使用信息的…...

matlab figure函数 single 数据类型

1.matlab figure函数详细介绍 在MATLAB中,figure函数用于创建新的图形窗口或激活现有的图形窗口。以下是figure函数的详细介绍和用法: 基本用法 创建新图形窗口:不带任何参数调用figure会创建一个新的图形窗口,并将其设为当前活…...

endroid/qr-code生成二维码,中文乱码的解决方案

endroid/qr-code version:6.0.3 默认不支持中文; 1、https://fonts.google.com/noto/fonts,从这里下载字体; 2、下载简体中文:Noto Sans Simplified Chinese 3、下载后,把压缩包解压,把NotoSansSC-Regul…...

深度和法线纹理

屏幕后期处理效果的基本原理就是当游戏画面渲染完毕后通过获取到该画面的信息进行额外的效果处理 之前的边缘检测、高斯模糊、Bloom、运动模糊等效果都是基于获取当前屏幕图像中的像素信息进行后期处理的 如果仅仅根据像素信息来进行一些效果处理,存在以下问题&…...

监听H5页面在微信浏览器异常退出

参考文章 onBeforeUnmount(() > {unNormalExit(); });//---------------------------异常退出---------------------- function unNormalExit() {enterOrExitRoom({type: 37,roomId: roomId.value,userId: userId.value,nickName: name.value,loginUserType: 2, //0 专家 1…...

Linux 串口编程

目录 前言一、tty体系二、串口硬件基础知识三、Linux下的串口编程3.1 打开串口3.2 从串口读写数据,问题1、2的诞生3.3 关闭串口3.4 串口配置3.4.1 获取/设置串口的参数3.4.2 设置波特率3.4.3 设置控制模式标志3.4.4 设置本地模式标志3.4.5 设置输入模式标志3.4.6 设置输出模式标…...

Adminer源码编译 精简语言中英文和基本使用方法

Adminer是一个小而强悍的基于web的数据库管理工具, 官方默认支持几十种语言,但是对于中国的用户而言只需要有中文和英文就够了,其他语言基本无用。这就需要我们下载Adminer源码自己编译 Adminer.php , 如下图所示 adminer 中英文语言精简版本…...

go 中线程安全map

在 Go 语言中,官方包 sync.Map 确实提供了线程安全的映射数据结构。然而,正如你所提到的,使用 sync.Map 时,有时需要进行类型断言,这可能会让代码显得冗长或不直观。 如果你希望使用一个更加易用的线程安全映射&#…...

eslint 安装与使用-基础教程

中文官网 官方规则解析 规则参考 - ESLint - 插件化的 JavaScript 代码检查工具 eslint ESlint 是一个检查 JS,TS 语法的工具.能够与常用开发工具,例如 VS Code,进行集成并提供错误提示,和可能的修正方法 安装 安装eslint npm init esli…...

自然语言处理的未来愿景

自然语言处理的未来愿景 在这个信息爆炸的时代,计算机如何理解和生成我们日常使用的语言,已经成为一个引人注目的问题。你有没有想过,为什么智能助手能理解你的指令?又或者,为什么社交媒体上的推荐引擎能够精准地推荐你喜爱的内容?这背后,正是自然语言处理(NLP)在发挥…...

等保2.0三级测评华为华三交换机路由器

在使用本博客提供的学习笔记及相关内容时,请注意以下免责声明: 信息准确性:本博客的内容是基于作者的个人理解和经验,尽力确保信息的准确性和时效性,但不保证所有信息都完全正确或最新。 非专业建议:博客中的内容仅供参考,不能替代专业人士的意见和建议。在做出任何重要…...

BA和CS算法中的Levy飞行策略

Levy飞行策略通过模拟自然界中动物的长距离迁徙行为,指导粒子进行更大范围的搜索,有助于算法快速找到全局最优解。它是一种具有独特优势的随机行为策略,模拟随机游走或搜索过程中的步长和方向,其步长的概率分布为重尾分布&#xf…...

PHP:实现两张无关联表数据的联合分页处理方案

前言 在现代软件开发中,高效地处理数据是至关重要的环节。尤其是在使用 PHP 进行开发时,常常会遇到各种复杂的数据处理需求。其中,实现两张无关联表数据的联合分页处理就是一个具有挑战性的任务。这种需求在很多实际应用场景中都可能出现&am…...

【单元测试】单元测试介绍

1 单元测试基础 1.单元测试:单元测试又称模块测试,属于白盒测试,是最小单位的测试。模块分为程序模块和功能模块。功能模块指实现了一个完整功能的模块(单元),一个完整的程序单元具备输入、加工和输出三个…...

PyQt事件机制及其应用

一、实例前置 一个小闹钟应用 创建主窗口类 首先我们创建了一个名为AlarmClock的类,它继承自QMainWindow。这个类将包含我们的GUI组件和逻辑。 from Alarm_clock import Ui_MainWindowclass AlarmClock(QMainWindow):def __init__(self):super().__init__()# 初始化…...

厦门凯酷全科技有限公司抖音电商服务的卓越典范

在短视频和直播带货迅速崛起的时代,厦门凯酷全科技有限公司(以下简称“凯酷全科技”)以其专业的服务、创新的精神以及对市场的深刻理解,在抖音电商领域中脱颖而出,成为众多品牌商家信赖的选择。本文将深入探讨凯酷全科…...

vue3水波柱状图 ,实现

效果图 //引用页面 <div style"height: 60px;background-color: #fff;border-radius: 5px;width: 40px;"><WavePercentage:percentage"progress"primary-color"#ffcb7c"secondary-color"#ffcb7c"/></div>import Wa…...

如何在两台 PostgreSQL 服务器之间使用逻辑复制槽进行数据复制

如何在两台 PostgreSQL 服务器之间使用逻辑复制槽进行数据复制 如何在两台 PostgreSQL 服务器之间使用逻辑复制槽进行数据复制环境准备1. 配置主服务器&#xff08;Publisher&#xff09;1.1 修改 postgresql.conf1.2 修改 pg_hba.conf1.3 重启 PostgreSQL 服务1.4 创建逻辑复制…...

System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本

问题1&#xff1a;“/”应用程序中的服务器错误。 System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本。 说明: 执行当前 Web 请求期间&#xff0c;出现未经处理的异常。请检查堆栈跟踪信息&#xff0c;以了解有关该错误以及代码中导致错误的出处的详细…...

【机器人】振动分析和控制工具之Bode图

Bode 图完整介绍 Bode 图由两个部分组成&#xff1a; 幅值图 (Magnitude Plot)&#xff1a;描述系统对不同频率输入信号的增益大小&#xff08;幅值响应&#xff09;。相位图 (Phase Plot)&#xff1a;描述系统输出信号相对于输入信号的相位差。 Bode 图的横轴是频率&#x…...

生成:安卓证书uniapp

地址&#xff1a; https://ask.dcloud.net.cn/article/35777 // 使用keytool -genkey命令生成证书&#xff1a; 官网&#xff1a; keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore test.keystore ----------------------------------…...

虚拟主机对网站seo有哪些影响/网站seo优化运营

phpmyadmin1、先下载一份最新版的phpMyAdmin MYSQL管理器&#xff0c;可以到天空软件站去下载&#xff0c;我刚下载的是2.8.2.1的版本2、解压后得到一个phpMyAdmin的目录(你可以改名)找到目录里的config.inc.php文件(最新版的在解压得到的文件夹中找不到了&#xff0c;其实你可…...

wordpress在线播放电影/短链接购买

这本书中我最感兴趣的一个章节是软件测试&#xff0c;因为寒假的时候我帮助我邻居测试他的软件运行情况&#xff0c;我用他设计的软件&#xff0c;然后提出问题&#xff0c;当我的问题提出后&#xff0c;然后提出应该怎样做用户会比较方便&#xff0c;感觉当时特别有成就感。曾…...

企业网站建设需要哪些费用/推广点击器

在上篇文章写到我们为什么要分层.有很多读者提出来很多宝贵的意见.让我受益匪浅,深深的感觉到自己的水平"还有很大的提升空间".首先感谢这些朋友们,我会进一步总结完善自己的想法. 截取了部分朋友的留言,感谢他们: 这次我用对比的方式描述一下,分层到底分出了什么.俗…...

汕头网站备案/廊坊快速排名优化

D 题意&#xff1a; 就是让你构造一个n个点的数&#xff0c;然后&#xff0c;一个点度为i的权值为va[i]现在问你构造出的树&#xff0c;最大的权值和是多少。 思考&#xff1a; 刚开始看到感觉就是一共2*(n-1)个度&#xff0c;然后直接完全背包跑一遍&#xff0c;但是不对。然…...

手机网站建设维护协议/不用流量的地图导航软件

在线课堂&#xff1a;https://www.100ask.net/index&#xff08;课程观看&#xff09; 论  坛&#xff1a;http://bbs.100ask.net/&#xff08;学术答疑&#xff09; 开 发 板&#xff1a;https://100ask.taobao.com/ &#xff08;淘宝&#xff09;      https://weid…...

可信网站标准版/seo网站推广多少钱

****一、磁盘原理****设备又名I/O设备&#xff0c;泛指计算机系统中除主机以外的所有外部设备。1.1 计算机分类1.1.1 按照信息传输速度分&#xff1a;1.低速设备&#xff1a;每秒传输信息仅几个字节或者百个字节&#xff0c;如&#xff1a;键盘、鼠标等2.中速设备&#xff1a;每…...