目录
[2.1、简单模式(Simple Mode)](#2.1、简单模式(Simple Mode))
[2.2、工作队列模式(Work Queue Mode)](#2.2、工作队列模式(Work Queue Mode))
[2.3、发布/订阅模式(Publish/Subscribe Mode)](#2.3、发布/订阅模式(Publish/Subscribe Mode))
[2.4、路由模式(Routing Mode)](#2.4、路由模式(Routing Mode))
RabbitMQ 是一个基于 AMQP(高级消息队列协议)的开源的消息代理。
1、 特点
- 支持多种协议(AMQP, MQTT, STOMP等)。
- 强大的消息路由功能。
- 支持事务和确认机制,保证消息传递的可靠性。
- 提供丰富的管理界面和监控功能。
2、 RabbitMQ的 消息传递 模式
2.1、简单模式(Simple Mode)
P2P模式包含三个角色:消息队列(Queue)、发送者(Sender)、接收者(Receiver) 。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到它们被消费或超时。适用于简单的点对点通信场景
- 每个消息只有一个消费者(Consumer),即一旦被消费,消息就不再在消息队列中
- 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行它不会影响到消息被发送到队列
- 接收者在成功接收消息之后需向队列应答成功
- 如果希望发送的每个消息都会被成功处理的话,那么需要P2P模式
2.2、工作队列模式(Work Queue Mode)
适用于需要并行处理任务的场景,如图像处理、数据计算等。
特点:
允许多个消费者从同一个队列中接收消息。这种模式通过在消费者之间分配任务来提高消息处理的效率。
2.3、发布/订阅模式(Publish/Subscribe Mode)
P2P模式包含三个角色:消息队列(Queue)、发送者(Sender)、接收者(Receiver)。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到它们被消费或超时。适用于需要消息广播的场景,例如新闻更新、日志记录等。
特点:
- 每个消息可以有多个消费者发布者和订阅者之间有时间上的依赖性。
- 针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息
- 为了消费消息,订阅者必须保持运行的状态
- 如果希望发送的消息可以不被做任何处理、或者只被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型
2.4、 路由模式(Routing Mode)
适用于需要根据特定条件或规则将消息路由到不同处理者的场景。
特点:
生产者将消息发送到交换机,交换机根据消息的路由键(Routing Key)将消息发送到特定的队列。消费者监听这些队列以接收消息。
3、 RabbitMQ集群
3.1、 RabbitMQ 部署和集群配置的三种模式
1、单机模式。
2、普通模式(默认的集群模式)。
3、镜像模式(把需要的队列做成镜像队列,存在于多个节点,属于RabbiMQ的HA方案,在对业务可靠性要求较高的场合中比较适合)。要实现镜像模式,需要先搭建出普通集群模式,在这个模式的基础上再配置镜像模式以实现高可用。
3.2、 RabbitMQ集群的基本概念
在 RabbitMQ 集群中,所有节点都会同步元数据,包括队列、交换器、绑定和 vhost 的定义。这意味着无论在哪个节点上创建或修改这些资源,其他节点都会自动更新。
3.2.1、节点类型
磁盘节点:默认的节点类型,将元数据(包括队列、交换器、绑定和 vhost 的定义)存储在磁盘上。集群中至少需要一个磁盘节点来持久化元数据。
内存节点:将元数据存储在内存中,不提供持久化。通常用于提高性能,但重启后元数据会丢失。
内存节点虽然不写入磁盘,但是它执行比磁盘节点要好。集群中,只需要一个磁盘节点来保存数据就足够了
如果集群中只有内存节点,那么不能停止它们,否则所有的状态,消息等都会丢失。
3.2.2、核心组件
Broker:消息队列服务器实体
ConnectionFactory(连接管理器):应用程序与Rabbit之间建立连接的管理器,程序代码中使用;
Exchange(交换器):用于接受、分配消息;
Routing Key:路由关键字,exchange根据这个关键字进行消息投递;
Queue(队列):用于存储生产者的消息;
Bindding:绑定,把exchange和queue按照路由规则绑定起来。
vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离.
producer:消息生产者,就是投递消息的程序。
consumer:消息消费者,就是接受消息的程序。
channel:(信道)消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。消息推送使用的通道;

4、rabbitMQ普通集群部署
4.1、环境准备
|------------|--------------|-----------------|
| 主机名 | ip地址 | 版本 |
| rebbitMQ01 | 10.211.55.57 | aarch64的centos9 |
| rebbitMQ02 | 10.211.55.58 | aarch64的centos9 |
| rebbitMQ03 | 10.211.55.59 | aarch64的centos9 |
安装依赖(三台服务器安装配置一致)
yum install -y *epel* gcc-c++ unixODBC openssl-devel ncurses-devel
配置host文件
root@rabbitMQ2 \~\]# vim /etc/hosts 10.211.55.57 rabbitMQ1 10.211.55.58 rabbitMQ2 10.211.55.59 rabbitMQ3 #### ******4.2、**** ****安装relang环境**** ****(**** ****三台服务器安装配置一致**** ****)****** ****下载地址:https://github.com/rabbitmq/erlang-rpm/releases/**** ****根据自身环境下载安装**** ****wget**** [https://github.com/rabbitmq/erlang-rpm/releases/download/v27.2.2/erlang-27.2.2-1.amzn2023.aarch61.rpm](https://github.com/rabbitmq/erlang-rpm/releases/download/v27.2.2/erlang-27.2.2-1.amzn2023.aarch64.rpm "https://github.com/rabbitmq/erlang-rpm/releases/download/v27.2.2/erlang-27.2.2-1.amzn2023.aarch61.rpm") ****rpm -ivh erlang-27.2.2-1.amzn2023.aarch61.rpm**** [root@rabbitMQ1 ~]# rpm -ivh erlang-27.2.2-1.amzn2023.aarch61.rpm Verifying... ################################# [100%] Preparing... ################################# [100%] Updating / installing... 1:erlang-27.2.2-1.amzn2023 ################################# [100%] ****验证是否安装成功**** [root@rabbitMQ1 ~]# erl Erlang/OTP 27 [erts-15.2.2] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [jit] Eshell V15.2.2 (press Ctrl+G to abort, type help(). for help) #### ******4.3、**** ****安装**** ****rabbitMQ(三台服务器安装配置一致)****** ****官方安装教程:**** [Installing on RPM-based Linux \| RabbitMQ](https://www.rabbitmq.com/docs/install-rpm#cloudsmith "Installing on RPM-based Linux | RabbitMQ") ##### ******下载安装****** \[root@rabbitMQ1 \~\]# wget [https://github.com/rabbitmq/rabbitmq-server/releases/download/v1.0.5/rabbitmq-server-1.0.5-1.el8.noarch.rpm](https://github.com/rabbitmq/rabbitmq-server/releases/download/v4.0.5/rabbitmq-server-4.0.5-1.el8.noarch.rpm "https://github.com/rabbitmq/rabbitmq-server/releases/download/v1.0.5/rabbitmq-server-1.0.5-1.el8.noarch.rpm") \[root@rabbitMQ1 \~\]# yum localinstall -y rabbitmq-server-1.0.5-1.el8.noarch.rpm ##### ******启动****** systemctl start rabbitmq-server systemctl enable rabbitmq-server #### ******4.4、开启web访问页面(启用插件)****** rabbitmq-plugins enable rabbitmq_management #### ******4.5、访问(新增用户,设置权限)****** [http://10.211.55.57:15672/](http://10.211.55.57:15672/ "http://10.211.55.57:15672/") [http://ip:15672](http://ip:15672/ "http://ip:15672") 用户名:guest 密码:guest ****上述用户仅支持本机登录**** ****远程登录需添加新用户**** 添加新用户 rabbitmqctl add_user zjp zjp 设置管理员 rabbitmqctl set_user_tags zjp administrator 设置新用户的权限 rabbitmqctl set_permissions -p / zjp ".\*" ".\*" ".\*" 查看用户 rabbitmqctl list_users  备注: 4369 -- erlang端口 5672 --程序连接端口 15672 --- web界面访问端口 25672 -- server间内部通信端口 #### ******4.6、**** ****创建日志、数据保存目录****** ****三个服务器均操作**** ```bash [root@rabbitMQ1 ~]# mkdir -p /data/rabbitmq/data [root@rabbitMQ1 ~]# mkdir -p /data/rabbitmq/logs [root@rabbitMQ1 ~]# chmod 777 -R /data/rabbitmq [root@rabbitMQ1 ~]# chown rabbitmq.rabbitmq /data/ -R ``` #### ******4.7、创建配置文件并配置****** RABBITMQ_MNESIA_BASE=/data/rabbitmq/data RABBITMQ_LOG_BASE=/data/rabbitmq/logs ****填入上述配置**** ```bash [root@rabbitMQ1 ~]# vim /etc/rabbitmq/rabbitmq-env.conf [root@rabbitMQ1 ~]# cat /etc/rabbitmq/rabbitmq-env.conf RABBITMQ_MNESIA_BASE=/data/rabbitmq/data RABBITMQ_LOG_BASE=/data/rabbitmq/logs ``` ****配置完后三台机子重启服务**** ****(**** ****可等下面erlang集群构建后再一起重启**** ****)**** systemctl restart rabbitmq-server #### ******4.8、构建erlang集群****** ****Rabbitmq的集群是依附于erlang的集群来工作的,所以必须先构建起erlang的集群。**** ****erlang集群构建方法很简单,将三台机子中的其中一台的这个文件/var/lib/rabbitmq/.erlang.cookie,的内容拷贝到其他两台即可,拷贝过去后需要设置400权限。**** ****查看rabbitmq-1的.erlang.cookie文件内容,**** ****(其他两台机器这个文件的内容替换成这个文件的内容就构成了一个erlang集群)**** ```bash [root@rabbitMQ1 ~]# cat /var/lib/rabbitmq/.erlang.cookie JXUSRTWCVLRVAMPQWISW ``` ****设置/var/lib/rabbitmq/.erlang.cookie的权限为400**** ```bash [root@rabbitMQ1 ~]# chmod 400 /var/lib/rabbitmq/.erlang.cookie ``` ****将rabbitmq-1文件的内容拷贝到其他两台机器rabbitmq-2、rabbitmq-3里**** ```bash [root@rabbitMQ1 ~]# scp /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/ [root@rabbitMQ1 ~]# scp /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/ ``` ****重启rebbitmq-2 rebbitmq-3服务(这里因为rabbitmq-1是传过去的本身没有改变所以不需要重启)**** systemctl restart rabbitmq-server #### ******4.9、将**** ****节点加入集群,**** ****并**** ****指定角色****** ****加入前均先停止并初始化节点**** ```bash [root@rabbitMQ2 ~]# rabbitmqctl stop_app Stopping rabbit application on node rabbit@rabbitMQ2 ... ``` \[root@rabbitMQ2 \~\]# rabbitmqctl reset(可不初始化,初始化会使前面创建的用户也删掉) Resetting node rabbit@rabbitMQ2 ... ****rabbitMQ2、rabbitMQ3加入内存节点**** ```bash rabbit@rabbitMQ1怎么查? [root@rabbitMQ1 ~]# rabbitmqctl cluster_status [root@rabbitMQ2 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitMQ1 Clustering node rabbit@rabbitMQ2 with rabbit@rabbitMQ1 ``` ****加入后**** ****都**** ****启动节点**** rabbitmqctl start_app ****默认rabbit**** ****MQ1**** ****启动后是磁盘节点,在这个cluster命令下,mq-2和mq-3是内存节点,**** ****MQ1是磁盘节点。**** ****如果要使mq-2、mq-3都是磁盘节点,去掉--ram参数即可。**** ****(3)**** ****如果想要更改节点类型,**** ****可以使用命令rabbitmqctl change_cluster_node_type**** ****disc(ram),**** ****前提是必须停掉rabbitmq应用**** #### ******4.10、查看集群状态****** 在 RabbitMQ 集群任意节点上执行 ****rabbitmqctl cluster_status**** 来查看是否集群配置成功。 ****在**** ****MQ**** ****1磁盘节点上面查看(集群里的任意一台机器查看都行,这里选择的是**** ****MQ**** ****1)**** #### ******4.11、验证****** ****三台机器访问15672端口的web页面****  根据界面提示创建一条队列  ****其他两台机器的web界面也能看到刚刚创建的队列****  ### ****5、rabbitMQ镜像集群配置**** ****启用插件**** rabbitmq_federation ```bash [root@rabbitMQ2 ~]# rabbitmq-plugins enable rabbitmq_federation Enabling plugins on node rabbit@rabbitMQ2: rabbitmq_federation The following plugins have been configured: rabbitmq_federation rabbitmq_management rabbitmq_management_agent rabbitmq_web_dispatch Applying plugin configuration to rabbit@rabbitMQ2... The following plugins have been enabled: rabbitmq_federation ``` ****在集群里的任意一台机器上输入**** ****rabbitmqctl set_policy**** ****federate-me**** ****"\^" '{"ha-mode":"all"}'**** ```bash [root@rabbitMQ2 ~]# rabbitmqctl set_policy federate-me "^" '{"federation-upstream-set":"all"}' Setting policy "federate-me" for pattern "^" to "{"federation-upstream-set":"all"}" with priority "0" for vhost "/" ... ``` federate-me是策略名,\^表示匹配所有队列,****{"ha-mode":"all"}****,策略模式all即复制到所有节点,包含新增节点(已有队列不会生效) ****查看效果****  至此,rabbitMQ的基本部署,集群配置,镜像队列设置就完事了,感谢观看学习,文章有问题可留言作者会查看并分析处理🙂