RabbitMQ进阶--集群,分布式事务

news/2025/4/2 17:48:24/文章来源:https://www.cnblogs.com/5ran2yl/p/18800616

一.RabbitMQ集群搭建

RabbitMQ这款消息队列中间件产品本身是基于Erlang编写,Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的magic cookie来实现)。因此,RabbitMQ天然支持Clustering。这使得RabbitMQ本身不需要像ActiveMQ、Kafka那样通过ZooKeeper分别来实现HA方案和保存集群的元数据。集群是保证可靠性的一种方式,同时可以通过水平扩展以达到增加消息吞吐量能力的目的。
在实际使用过程中多采取多机多实例部署方式,为了便于同学们练习搭建,有时候你不得不在一台机器上去搭建一个rabbitmq集群,本章主要针对单机多实例这种方式来进行开展。

搭建集群之前需要先检查是否RabbbitMQ可以正常的运行:

#查看rabbitMQ的进程
ps aux|grep rabbitmq
#查看rabbitMQ状态
systemctl status rabbitmq-server

 

 

 注意:确保RabbitMQ可以运行的,确保完成之后,把单机版的RabbitMQ服务停止,后台看不到RabbitMQ的进程为止

systemctl stop rabbitmq-server

 

单机多实例搭建

场景:假设有两个rabbitmq节点,分别为rabbit-1, rabbit-2,rabbit-1作为主节点,rabbit-2作为从节点。
启动命令:RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit-1 rabbitmq-server -detached
结束命令:rabbitmqctl -n rabbit-1 stop

第一步:启动第一个节点rabbit-1

sudo RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit-1 rabbitmq-server start &

 

启动第二个节点rabbit-2

注意:web管理插件端口占用,所以还要指定其web插件占用的端口号
RABBITMQ_SERVER_START_ARGS=”-rabbitmq_management listener [{port,15673}]”

 验证是否两个服务都启动了“

ps aux|grep rabbitmq

rabbit-1操作作为主节点

#停止应用
> sudo rabbitmqctl -n rabbit-1 stop_app
#目的是清除节点上的历史数据(如果不清除,无法将节点加入到集群)
> sudo rabbitmqctl -n rabbit-1 reset
#启动应用
> sudo rabbitmqctl -n rabbit-1 start_app

 

rabbit2操作为从节点

# 停止应用
> sudo rabbitmqctl -n rabbit-2 stop_app
# 目的是清除节点上的历史数据(如果不清除,无法将节点加入到集群)
> sudo rabbitmqctl -n rabbit-2 reset
# 将rabbit2节点加入到rabbit1(主节点)集群当中【Server-node服务器的主机名】
> sudo rabbitmqctl -n rabbit-2 join_cluster rabbit-1@'Server-node'
# 启动应用
> sudo rabbitmqctl -n rabbit-2 start_app

 

验证集群状态

 sudo rabbitmqctl cluster_status -n rabbit-1

 

Web监控

注意在访问的时候:web结面的管理需要给15672 node-1 和15673的node-2 设置用户名和密码。如下:

#rabbit-1 配置rabbitmqctl -n rabbit-1 add_user admin admin
rabbitmqctl -n rabbit-1 set_user_tags admin administrator
rabbitmqctl -n rabbit-1 set_permissions -p / admin ".*" ".*" ".*"#rabbit-2 配置rabbitmqctl -n rabbit-2 add_user admin admin
rabbitmqctl -n rabbit-2 set_user_tags admin administrator
rabbitmqctl -n rabbit-2 set_permissions -p / admin ".*" ".*" ".*"

 

主机访问端口15762,从机访问端口1673

 Tips:
如果采用多机部署方式,需读取其中一个节点的cookie, 并复制到其他节点(节点之间通过cookie确定相互是否可通信)。cookie存放在/var/lib/rabbitmq/.erlang.cookie。
例如:主机名分别为rabbit-1、rabbit-2
1、逐个启动各节点
2、配置各节点的hosts文件( vim /etc/hosts)
​ ip1:rabbit-1
​ ip2:rabbit-2
其它步骤雷同单机部署方式

一主一从配置特点

RabbitMQ 集群部署可以提高消息服务的可用性和可靠性。在讨论一主一从(一个主节点和一个从节点)的配置特点之前,需要了解一些基本概念:

队列(Queue): RabbitMQ中用于存储消息的数据结构。
镜像队列(Mirrored Queue): 在集群环境中,为了提高队列的可用性,可以配置队列为镜像队列,这样消息会复制到多个节点上。
主节点(Master): 对于一个镜像队列,其中一个节点会被指定为主节点,负责处理所有对队列的操作请求。
从节点(Slave): 其他拥有该队列副本的节点称为从节点,在主节点不可用时,系统会选择一个从节点升级为新的主节点。

  • 当主节点或者从节点创建声明交换机时,另外一个rabbitmq节点就会同步创建
  • 当从节点宕机之后,主节点依旧可以工作;而主节点宕机之后,从节点不能独立工作
  • 从节点的消息发送依赖于主节点

消息写入:当客户端发送消息到RabbitMQ集群时,这些消息首先到达队列的主节点。然后,根据镜像队列的配置,主节点会负责将消息复制到所有从节点上。
消息读取:消费者可以从任何一个节点消费消息。如果消费者连接到了一个从节点,该从节点会与对应的主节点通信来获取消息。

单机模式:一个rabbitMQ节点,集群模式:多个rabbitMQ节点连接在一起,本质都是由节点构成

二.分布式事务 

分布式事务指事务的操作位于不同的节点上,需要保证事务的 AICD 特性。
例如在下单场景下,库存和订单如果不在同一个节点上,就涉及分布式事务。

MQ 事务消息 异步场景,通用性较强,拓展性较高

有一些第三方的MQ是支持事务消息的,比如RocketMQ,他们支持事务消息的方式也是类似于采用的二阶段提交,但是市面上一些主流的MQ都是不支持事务消息的,比如 Kafka 不支持。
以阿里的 RabbitMQ 中间件为例,其思路大致为:

  • 第一阶段Prepared消息,会拿到消息的地址。 第二阶段执行本地事务,第三阶段通过第一阶段拿到的地址去访问消息,并修改状态。
    • 也就是说在业务方法内要想消息队列提交两次请求,一次发送消息和一次确认消息。如果确认消息发送失败了RabbitMQ会定期扫描消息集群中的事务消息,这时候发现了Prepared消息,它会向消息发送者确认,所以生产方需要实现一个check接口,RabbitMQ会根据发送端设置的策略来决定是回滚还是继续发送确认消息。这样就保证了消息发送与本地事务同时成功或同时失败。

 优点: 实现了最终一致性,不需要依赖本地数据库事务。
缺点: 实现难度大,主流MQ不支持,RocketMQ事务消息部分代码也未开源。

分布式事务本身是一个技术难题,是没有一种完美的方案应对所有场景的,具体还是要根据业务场景去抉择吧。阿里RocketMQ去实现的分布式事务,现在也有除了很多分布式事务的协调器,比如LCN等,大家可以多去尝试。

 

------END-----

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业为何要使用odoo18

在当今快速变化的商业环境中,企业需要高效、灵活且经济实惠的管理工具来保持竞争力。Odoo 18 作为一款开源的企业资源计划(ERP)系统,凭借其全面的功能和独特的优势,成为众多企业的首选。为什么选择 Odoo 18? 1. 全面的功能覆盖 Odoo 18 集成了销售、采购、库存、制造、财…

deepclaude 的使用 直捣黄龙

先说结论,最简单的就是购买deepseek 和 claude 的api之后, 直接使用vscode中的cline插件,其中 cline的plan(计划模式)配置deepseek的api,act(执行模型)配置claude的api 直接上连接: deepseek开放平台 https://platform.deepseek.com/ claude 开放平台 https://con…

CentOS 7安装Docker

1.系统需求CentOS 7或更高版本。 centos-extras仓库必须处于启用状态,该仓库默认启用,但如果禁用了该仓库,请重新启用。 建议使用overlay2存储驱动。 2.使用Yum安装 2.1卸载老版本的Docker 在CentOS中,老版本Docker的软件包名是docker或docker-engine,而Docker CE的软件包…

GMap.NET + WPF:构建高性能 ADS-B 航空器追踪平台

ADS-B 简介ADS - B(Automatic Dependent Surveillance - Broadcast,广播式自动相关监视)是一种先进的航空监视技术。它依靠飞机上的机载设备,自动收集诸如飞机的位置、高度、速度、航向等关键数据,并周期性地以广播的形式向外发送这些信息。地面站和其他装有 ADS-B 接收设…

20241319 实验二《Python程序设计》实验报告

学号 2024-2025-2 《Python程序设计》实验二报告 课程:《Python程序设计》 班级: 2413 姓名: 吴辰曦 学号:20241319 实验教师:王志强 实验日期:2025年3月26日 必修/选修: 公选课 1.实验内容 设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善。 考核基…

GMap.NET + C#:构建高性能 ADS-B 航空器追踪平台

ADS - B 简介ADS - B(Automatic Dependent Surveillance - Broadcast,广播式自动相关监视)是一种先进的航空监视技术。它依靠飞机上的机载设备,自动收集诸如飞机的位置、高度、速度、航向等关键数据,并周期性地以广播的形式向外发送这些信息。地面站和其他装有 ADS - B 接…

20242112 2024-2025-2 《Python程序设计》实验报告

课程:《Python程序设计》 班级: 2421 姓名: 张童哲 学号:20242112 实验教师:王志强 实验日期:2025年3月26日 必修/选修: 公选课 1.实验内容 1.1设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善。 1.2考核基本语法、判定语句、循环语句、逻辑运算等知…

simple_php你 攻防世界

审计代码,看到几个关键信息。可以看到:构建payload 有a,b,两个值。 看哈, $a==0 and $a 所有字母转成数字的时候换成0 即可满足所有要求。要求不是数字。是数字就跳出。还要b>1234 构建payload:/?a=asd$b=1231232aaa看清楚哦。&是连接符。$这是美元符号ohhh

Linux 离线升级 RSYNC

前言:本文操作是在 CentOS-7 下执行的,不确定在其他 Linux 发布版是否能同样正常执行。1、检查前置依赖组件在安装 rsync 之前,需要确认已安装了相关依赖组件: gcc 、openssl-devel 、xxhash 、zstd 、lz4 。 rpm -qa | grep gccrpm -qa | grep openssl-develwhich xxhsumw…

AireOS WLC安装License报错

​1.概述 本文主要记录在AireOS的WLC上安装License错误的情况。License的类型也是传统的License,因为设备的型号已经EOL,相关的资料应该较少,这里进行可能问题的记录。 2.适用场景 型号:WLC2500,WLC5508 License类型:传统License文件,如.lic的文件类型。 其他的型号多数…

在VS2022中练习“栈”

1.vs不能使用#include<stdio.h>等c语言的头文件 解决方法: 在vs instuall中“c++控制台应用”右边的方框,点击它,从它的列表中找到windowsSDK10,点击安装,等待即可

weak_auth 攻防世界 简单密码

根据题目得知考察简单密码。 admin 123456 。。。。。。。