rabbitmq集群-普通模式

news2025/7/14 10:55:39

RabbitMQ的Cluster模式分为两种

  1. 普通模式
  2. 镜像模式

1. 概念解释

1.1 什么是普通模式

普通集群模式,就是将 RabbitMQ 部署到多台服务器上,每个服务器启动一个 RabbitMQ 实例,多个实例之间进行消息通信。

此时我们创建的队列 Queue,它的元数据(主要就是 Queue 的一些配置信息)会在所有的 RabbitMQ 实例中进行同步,但是队列中的消息只会存在于一个 RabbitMQ 实例上,而不会同步到其他队列。

当我们消费消息的时候,如果连接到了另外一个实例,那么那个实例会通过元数据定位到 Queue 所在的位置,然后访问 Queue 所在的实例,拉取数据过来发送给消费者。

这种集群可以提高 RabbitMQ 的消息吞吐能力,但是无法保证高可用,因为一旦一个 RabbitMQ 实例挂了,消息就没法访问了,如果消息队列做了持久化,那么等 RabbitMQ 实例恢复后,就可以继续访问了;如果消息队列没做持久化,那么消息就丢了。

大致的流程图如下图:

在这里插入图片描述
*我们会发现,其实队列的数据只是保存了一份,其他的broker只是保留了元数据而已,用来访问交换机,binding或者队列的基本信息(比如地址啥的)

1.2 什么是元数据

元数据包含以下内容:

  • 队列元数据:队列的名称及属性
  • 交换器:交换器的名称及属性
  • 绑定关系元数据:交换器与队列或者交换器与交换器
  • vhost元数据:为vhost内的队列,交换器和绑定提供命名空间及安全属性之间的绑定关系
1.3 节点类型

RabbitMQ 中的节点类型有两种:

  • RAM node:内存节点将所有的队列、交换机、绑定、用户、权限和 vhost 的元数据定义存储在内存中,好处是可以使得交换机和队列声明等操作速度更快。
  • Disk node:将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启 RabbitMQ 的时候,丢失系统的配置信息

RabbitMQ 要求在集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入或者离开集群时,必须要将该变更通知到至少一个磁盘节点。如果集群中唯一的一个磁盘节点崩溃的话,集群仍然可以保持运行,但是无法进行其他操作(增删改查),直到节点恢复。为了确保集群信息的可靠性,或者在不确定使用磁盘节点还是内存节点的时候,建议直接用磁盘节点。

1.4 缺点

我们会发现,在这汇总集群方式中的情形下,我们会遇到如下几个问题

  1. 保存队列的节点很难知道
  2. 一旦保存队列信息的节点宕机,其实,集群还是没办法工作

2 windows下单机配置rabbitmq集群(普通模式)

2.1 安装rabbitmq

参考文章window下单机搭建RabbitMQ多节点集群

开启三个服务器
分别访问他们的ui管理界面
http://localhost:15673/#/
http://localhost:15674/#/
http://localhost:15675/#/
界面应当如下,节点名称应当会变,但是应当可以访问
在这里插入图片描述

2.2 建立集群

关闭rabbitmq node 2,3,让他们加入rabbit1集群

如果是通过rabbitmq-server方式启动的,直接关闭运行界面就可以了,如果是通过rabbitmq-server -detached的话,执行

D:\tools\RabbitMQ Server\rabbitmq_server-3.8.4-2\sbin>rabbitmqctl stop_app
Stopping rabbit application on node rabbit2@DESKTOP-IB5K0.. ... //成功关闭提示

ok,那我们正式开始,关闭所有的节点(命令基于powershell)

2.2.1 启动rabbit1,执行 .\rabbitmq-server.bat -detached

在这里插入图片描述
打开 http://localhost:15673/#/ 查看信息

2.2.2 将 rabbit2 加入 rabbit1, 在rabbit2的目录下执行:
.\rabbitmqctl.bat join_cluster rabbit1

出现如下提示,
在这里插入图片描述
我们查看http://localhost:15673/#/,
在这里插入图片描述
rabbit2节点没有启动,但是加进来了。

2.2.3 启动节点rabbit2

在D:\rabbitmq_server-3.10.6-2\sbin 下执行如下命令

rabbitmqctl start_app

新节点
rabbit2节点启动了

同理,注册rabbit3到集群中,并且启动
可以在ui中查看到注册进来了
在这里插入图片描述

2.2.4 查看集群状态

我们切换到server-1下执行命令

 .\rabbitmqctl.bat cluster_status

可以查看各种节点的信息
在这里插入图片描述

2.2.5 退出集群

假如我们需要结束节点3,那么在对应的目录下,执行命令如下

  1. rabbitmq-server -detached (已经启动可以忽略这一步)
  2. rabbitmqctl stop_app (关闭节点)
  3. rabbitmqctl reset
    在这里插入图片描述
    我们查看ui管理,发现节点rabbit3确实没了
    在这里插入图片描述
    至此,普通集群已初步搭建,这种集群可以提高 RabbitMQ 的消息吞吐能力,但是无法保证高可用,因为一旦一个 RabbitMQ 实例挂了,消息就没法访问了,如果消息队列做了持久化,那么等 RabbitMQ 实例恢复后,才可以继续访问;如果消息队列没做持久化,那么消息就丢了。基于这种情况,我们可以将队列设置为镜像队列来解决

3 spring boot + rabbitmq集群(单节点配置)

我们发现无论是访问下面的那个界面,都是出现了集群的信息的
http://localhost:15673/#/
http://localhost:15674/#/
http://localhost:15675/#/

前文请参考:spring-boot rabbitmq整合

3.1 发送单点结合,但是在另外的节点也是可以消费的

如果publish指定集群的某个节点,其他的节点也是可以访问这个message的,除非该节点宕机了。

3.1.1 生产者设置节点是node1-rabbit1

测试
搭建好集群后,我们需要做个测试,我们发送一个mq消息,会发现三个节点都有这个消息,我们修改配置把publish的broker节点设置为5673,而不是address设置集群地址

spring:
  rabbitmq:
    host: 0.0.0.0
    port: 5673
    username: root
    password: root
    publisher-confirms: true    #确认消息已发送到交换机(Exchange)
    publisher-returns: true     #确认消息已发送到队列(Queue)

如果root没有权限,请改成guest/guest都行,我们发送了一个名为TestDirectQueue的队列,我们去

http://localhost:15673/#/queues
http://localhost:15674/#/queues
http://localhost:15675/#/queues

看,我们会发现都有未消费的的message

在这里插入图片描述

3.1.2 生产者设置消费者节点是node2-rabbit2

修改consumer配置为:

spring:
  rabbitmq:
    host: 0.0.0.0
    port: 5674
    username: root
    password: root
    virtual-host: pers-xrb
    listener:
      direct:
        retry:
          max-attempts: 3
      simple:
        retry:
          max-attempts: 3
        acknowledge-mode: manual

启动consumer项目,我们可以发现,message被消费完了
在这里插入图片描述
总结
我们可以大胆的猜测,保留队列信息的消息在节点1,rabbit1上的,但是集群中的其他节点也是可以消费的。如果节点1的消费者很慢的话,多几个节点也是可以的。但是如果rabbit1节点宕机了,理论上是其他节点应该是消费不了的了。

3.2 基于3.1,停机publish发布的节点-rabbit1,其他节点会丢失该节点信息
3.2.1 停止保存queue信息的节点

如果保存queue 消息队列的节点宕机了的话,那么就会发现,其他节点没有节点信息了,我们发送一个mq后,再执行命令,停止rabbit1

 .\rabbitmqctl.bat stop_app

在访问 http://localhost:15674/#/ 或者http://localhost:15675/#/ 我们会发现节点 rabbit1停止了,我们再看queue的消息
在这里插入图片描述
无法获取对应的消息了,启动消费者会报错
在这里插入图片描述

3.2.2 重启停止了的保存queue 消息的节点queue

我们执行命令,重启节点rabbit1

 .\rabbitmqctl.bat start_app

在这里插入图片描述
message又可见了,我们再重启消费者,消费成功
在这里插入图片描述

4 spring boot + rabbitmq集群(多节点配置)

参考 3. spring boot + rabbitmq集群(单节点配置) 只需要修改配置文件就可以了。

通常来说,配置rabbitmq的集群应该如下配置,在address中配置多个地址,通过都好分割

spring:
  rabbitmq:
    username: root
    password: root
    publisher-confirms: true    #确认消息已发送到交换机(Exchange)
    publisher-returns: true     #确认消息已发送到队列(Queue)
    addresses: 0.0.0.0:5674,0.0.0.0:5673,0.0.0.0:5675
    listener:
      simple:
        acknowledge-mode: manual

参考
  1. SpringBoot中RabbitMQ集群的搭建详解
  2. window下单机搭建RabbitMQ多节点集群(超详细)

代码地址: https://github.com/GitHubsteven/spring-in-action2.0/tree/master/spring-boot-mesage

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/396090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android ANR trace日志如何导出

什么是ANR ?上网搜索,一搜一大片,我就说个很容易识别的字眼,XXXAPP无响应 ANR trace日志如何导出?使用ADB命令: adb pull data/anr/trace.txt 你要存放的路径。查看ANR报错位置全局搜索你APP的包名&#x…

基于MATLAB的无线信道的传播与衰落(附完整代码与分析)

目录 一. 一般路径损耗模型 1. 1自由环境下路径损耗 1. 2 考虑实际情况 1.3 考虑阴影衰落 二. 代码仿真与理解 (1)函数文件 (2)函数文件 (3)主运行文件 三. 运行结果及理解 3.1 3.2 3.3 一. …

Nacos2.2.0多数据源适配oracle12C-修改Nacos源码

从2.2.0版本开始,可通过SPI机制注入多数据源实现插件,并在引入对应数据源实现后,便可在Nacos启动时通过读取application.properties配置文件中spring.datasource.platform配置项选择加载对应多数据源插件.本文档详细介绍一个多数据源插件如何实现以及如何使其生效。 文章目录一…

机器人运动|浅谈Time Elastic Band算法

前言在自主移动机器人路径规划的学习与开发过程中,我接触到Time Elastic Band算法,并将该算法应用于实际机器人,用于机器人的局部路径规划。在此期间,我也阅读了部分论文、官方文档以及多位大佬的文章,在此对各位大佬的…

git的使用整合

git的下载和安装暂时不论述了,将git安装后会自动配置环境变量,所以环境变量也不需要配置。 一、初始化配置 打开git bash here(使用linux系统下运行的口令),弹出一个类似于cmd的窗口。 (1)配置属性 git config --glob…

【LLVM系列】基本文件格式和 CFG 生成指令

一、基本文件格式 参考博客:llvm 文件转换图 .c 文件,c语言源代码。.bc 文件,llvm字节码的二进制形式(binary code)。.ll 文件,llvm字节码的文本形式。.s 文件,机器汇编代码。.out 文件&#…

操作系统-整理

进程 介绍 进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大&#…

第十三章:Java反射机制

第十三章:Java反射机制 13.1:Java反射机制概述 Java Reflection ​ Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。 ​ 加…

Spring Boot 实现多文件上传

文件上传 Spring Boot代码 代码结构: Controller层 package com.yqifei.upload.controller;import io.swagger.annotations.Api; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile;import javax.serv…

ETL --事实表

每一个事实表通过表的粒度来定义。事实表的粒度是事件度量的定义。我们必须至始至终按照度量如何在 现实世界中理解来规定事实表的粒度。 所有的事实表包含了一组关联到维表的外键,而这些维表提供了事实表度量的上下文。大多数的事实表还 包括了一个或者多个数值型…

小樽C++ 多章⑧ (贰) 指针与数组

目录 1.C中数组变量名某些情况可以看成是指针 2.C语言的scanf 输入语句,printf 输出语句 3.用指针来当动态数组 小樽C 多章⑧ (壹) 指针变量https://blog.csdn.net/weixin_44775255/article/details/129031168 小樽C 多章⑧ (叁) 指针与字符串、(肆) 函数与指针…

GitLab 凭借什么连续 3 年上榜 Gartner 应用程序安全测试魔力象限?听听 GitLab 自己的分析

本文来源:about.gitlab.com 作者:Sandra Gittlen 译者:极狐(GitLab) 市场部内容团队 应用程序安全测试(AST)对于应用程序研发来说,是一个正在快速发展并且十分重要的领域。DevOps 方法论提到:需…

Java基础之《dubbo(1)—dubbo基础入门》

一、为什么要使用dubbo 1、dubbo是什么 dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。 2、dubbo有何特点 (1)远程通讯:提供透明化的远程方法调用,提供…

入门JAVA第十七天 Oracle的JDBC技术

一、数据库JDBC技术学习内容与方法 1.1 学习内容 (1) Oracle数据库 目前最好的关系型数据库。 基本的CRUD命令 SQL语句。select(R),update(U),delete(D),insert(C) (2) MySQL数据库 中小型项目非常好用的关系型数据库。 灵活&…

【零基础入门前端系列】—浮动(十八)

【零基础入门前端系列】—浮动(十八) 一、浮动的定义 float属性定义元素在哪个方向,以往这个属性总应用于图像,使得文本围绕在图像的周围,不过在CSS中,任何元素都可以浮动,浮动的元素会生成一…

【Git】P5 Git 远程仓库(3)pull 发生冲突

pull 发生冲突冲突在什么场景下发生?为什么要先 pull 再 push构建一个冲突场景初始开始操作:程序员2:程序员1:程序员2:发生冲突:查看冲突:解决冲突:冲突在什么场景下发生&#xff1f…

[手写OS]动手实现一个OS 之 准备工作以及引导扇区

[手写OS]动手实现一个OS之第一步-环境以及引导扇区 环境准备 一台可用计算机(linux我不知道,我用的Windows)汇编编译器NASM一个方便的软盘读写工具VirtualBox 汇编编译器NASM 官网地址:https://www.nasm.us/pub/nasm/snapshot…

java 中的equals()示例代码

Java中的equals()是十分重要的,和要区别开来简述public booleanequals(Object obj)作用:判断其他的对象是否和该对象相等其比较规则为:当参数obj引用的对象与当前对象为同一个对象时,就返回true,否则返回false.简单示例equals()方…

代码随想录算法训练营第二十二天 | 235. 二叉搜索树的最近公共祖先 、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

打卡第22天,平衡二叉树,难,难,难。 今日任务 235.二叉搜索树的最近公共祖先701.二叉搜索树中的插入操作450.删除二叉搜索树中的节点 235.二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百…

BeanFactory接口

目录 概述 接口方法 BeanFactory重要的子类 概述 BeanFactory是容器的顶层接口,也是spring最核心的容器,管理bean的核心方法都在BeanFactory接口中定义。像ApplicationContext接口,ConfigurableApplicationContext接口都间接继承BeanFactory接口,既ApplicationContext调用ge…