RabbitMQ简介
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
erlang编译安装
由于RabbitMQ是基于erlang的,所以,在正式安装RabbitMQ之前,需要先安装一下erlang。
erlang与RabbitMQ版本的对应关系,如:RabbitMQ3.6.10,建议的erlang版本是19.3.x(安装前必看)
注:erlang-19.0.4只能安装rabbitmq3.6,安装3.7的话安装不报错,启动报错:必须是19.3以上
https://www.rabbitmq.com/which-erlang.html
https://www.erlang.org/downloads
安装依赖文件:
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel unixODBC unixODBC-devel python-simplejson
编译安装erlang语言环境: (现在至少要23版本才能配rabbitmq2.8.26)
# wget http://erlang.org/download/otp_src_19.2.tar.gz
# tar zxf otp_src_19.2.tar.gz
# cd otp_src_19.2
# ./configure --prefix=/usr/local/erlang
# make && make install
#加载环境变量
# vim /etc/profile
#set erlang environment
export ERL_HOME=/usr/local/erlang
export PATH=$ERL_HOME/bin:$PATH
# source /etc/profile
# erl #如果进入erlang的shell则证明安装成功,退出即可。如下面的效果:
Erlang/OTP 19 [erts-8.2] [source] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V8.2 (abort with ^G)
1>
erlang yum源安装
yum list erlang --showduplicates
yum install erlang
如果自带的yum源erlang版本过低,就使用下面官网的
https://packagecloud.io/rabbitmq/erlang
Centos7:
https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-23.3.4.7-1.el7.x86_64.rpm
curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash
Install
yum list erlang --showduplicates
yum install erlang-23.3.4.7-1.el7.x86_64
RabbitMQ二进制安装
https://www.rabbitmq.com/which-erlang.html#compatibility-matrix
https://www.rabbitmq.com/install-generic-unix.html
https://github.com/rabbitmq/rabbitmq-server/releases
1、安装方式
常见的rabbitmq安装方式有两种:rpm安装和二进制安装。
2、.erlang.cookie
是什么
.erlang.cookie
是erlang实现分布式的必要文件,erlang分布式的每一个节点上要保持相同的.erlang.cookie
文件,同时该文件的权限为400。
3、.erlang.cookie
文件路径
官方介绍集群的文档介绍如下: .erlang.cookie
一般会存在于两个地方,第一个是:$HOME/.erlang.cookie
;第二个是:/var/lib/rabbitmq/.erlang.cookie
。
如果我们使用解压缩安装方式(二进制安装或者编译安装),那么该文件存在位置为\$HOME目录下。即$HOME/.erlang.cookie
。如果我们使用root安装,则位置为:/root/.erlang.cookie
,其他用户为/home/用户名/.erlang.cookie
。
如果我们使用rpm包方式安装,那么这个文件会存在于/var/lib/rabbitmq
目录下。
重点: .erlang.cookie
文件的权限是400
下载安装RabbitMQ :
# yum install socat
# https://github.com/rabbitmq/rabbitmq-server/releases
# wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.15/rabbitmq-server-generic-unix-3.6.15.tar.xz
# wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.9.10/rabbitmq-server-generic-unix-3.9.10.tar.xz
# xz -d rabbitmq-server-generic-unix-3.6.15.tar.xz #不保留原文件解压
# tar -xvf rabbitmq-server-generic-unix-3.6.15.tar -C /usr/local/
# ln -sv /usr/local/rabbitmq_server-3.6.15/ /usr/local/rabbitmq
# vim /etc/profile
#set rabbitmq environment
export PATH=$PATH:/usr/local/rabbitmq/sbin
# source /etc/profile
# rabbitmq-server #前台启动rabbitmq
# rabbitmq-server -detached #-detached代表后台守护进程方式启动。
# rabbitmqctl stop 关闭服务
# rabbitmqctl status #查看状态
# rabbitmqctl cluster_status #查看集群状态
# rabbitmqctl list_users 列出角色
默认配置文件:
https://github.com/rabbitmq/rabbitmq-server/blob/master/deps/rabbit/docs/rabbitmq.conf.example
说明: Linux服务器的主机名不能用数字,否则mq无法启动
RabbitMQ yum源安装
访问:
curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | sudo bash
Install
sudo yum install rabbitmq-server-3.8.26-1.el7.noarch
yum安装配置文件位置如下:
启动rabbitmq常用的配置参数:
# cat /etc/rabbitmq/rabbitmq.conf
loopback_users.guest = false
listeners.tcp.default = 5672
#listeners.tcp.local = 127.0.0.1:5672
default_pass = admin
default_user = admin
management.tcp.port = 15672
management.tcp.ip = 0.0.0.0
default_vhost = /
default_permissions.configure = .*
default_permissions.read = .*
default_permissions.write= .*
default_user_tags.administrator = true
启动rabbitmq常用插件的配置参数:
# cat /etc/rabbitmq/enabled_plugins
[rabbitmq_delayed_message_exchange,rabbitmq_management].
注意:这两个参数互斥
listeners.tcp.default = 5672
#listeners.tcp.local = 127.0.0.1:5672
RabbitMQ rpm包安装
https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.8.25
RabbitMQ docker安装
https://www.rabbitmq.com/download.html
# for RabbitMQ 3.9, the latest series
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.9-management
# for RabbitMQ 3.8,
# 3.8.x support timeline: https://www.rabbitmq.com/versions.html
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.8-management
# latest RabbitMQ 3.11
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.11-management
默认账号/密码: guest/guest
RabbitMQ管理后台
(3.3.1版本以后默认不允许用guest远程管理。可以手动创建管理员帐号来远程管理,具体参见4.4)
插件地址:https://www.rabbitmq.com/community-plugins.html
启动Web管理插件:
rabbitmq-plugins list
rabbitmq-plugins enable rabbitmq_management #启动插件
netstat -lntup|egrep "epmd|beam"
4369端口是erlang发现端口,5672是client端通信口,15672是管理界面UI端口,25672是server间内部通信口
配置访问账号密码和权限并删除匿名用户:
默认网页是不允许访问的,需要增加一个用户修改一下权限,命令如下:
# rabbitmqctl list_users 列出角色
# rabbitmqctl add_user admin admin123 #添加admin用户和设置密码为admin123
Creating user "admin"
# rabbitmqctl set_permissions -p / admin ".*" ".*" ".*" #添加权限(使admin用户对虚拟主机“/” 具有所有权限):
Setting permissions for user "admin" in vhost "/"
# rabbitmqctl set_user_tags admin administrator #设置用户角色
Setting tags for user "admin" to [administrator]
现在在浏览器输入服务器IP:15672
就可以看到RabbitMQ的WEB管理界面了
概念:
- Broker:简单来说就是消息队列服务器实体。
- Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
- Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
- Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
- Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
- vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
- producer:消息生产者,就是投递消息的程序。
- consumer:消息消费者,就是接受消息的程序。
- channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务
RabbitMQ设置管理权限
https://www.cnblogs.com/williamjie/p/9481774.html
Rabbitmq服务器的主要通过rabbitmqctl和rabbimq-plugins两个工具来管理,以下是一些常用功能。
1)服务器启动与关闭
启动: rabbitmq-server -detached
关闭: rabbitmqctl stop
若单机有多个实例,则在rabbitmqctl后加-n
指定名称
2)插件管理
开启某个插件:rabbitmq-plugins enable xxx
关闭某个插件:rabbitmq-plugins disable xxx
3)virtual_host管理
新建virtual_host: rabbitmqctl add_vhost xxx
撤销virtual_host: rabbitmqctl delete_vhost xxx
4)用户管理
新建用户: rabbitmqctl add_user xxx pwd
删除用户: rabbitmqctl delete_user xxx
改密码: rabbimqctl change_password {username} {newpassword}
设置用户角色: rabbitmqctl set_user_tags {username} {tag ...}
Tag可以为 administrator,monitoring, management
5)权限管理
权限设置:set_permissions [-pvhostpath] {user} {conf} {write} {read}
Vhostpath
Vhost路径
user
用户名
Conf
一个正则表达式match哪些配置资源能够被该用户访问。
Write
一个正则表达式match哪些配置资源能够被该用户读。
Read
一个正则表达式match哪些配置资源能够被该用户访问。
6)获取服务器状态信息
服务器状态:rabbitmqctl status
队列信息:rabbitmqctl list_queues [-p vhostpath] [queueinfoitem ...]
Queueinfoitem可以为:name,durable,auto_delete,arguments,messages_ready,
messages_unacknowledged,messages,consumers,memory
Exchange信息:rabbitmqctllist_exchanges[-p vhostpath] [exchangeinfoitem ...]
Exchangeinfoitem有:name,type,durable,auto_delete,internal,arguments.
Binding信息:rabbitmqctllist_bindings[-p vhostpath] [bindinginfoitem ...]
Bindinginfoitem有:source_name,source_kind,destination_name,destination_kind,routing_key,arguments
Connection信息:rabbitmqctllist_connections [connectioninfoitem ...]
Connectioninfoitem有:recv_oct,recv_cnt,send_oct,send_cnt,send_pend等。
Channel信息:rabbitmqctl list_channels[channelinfoitem ...]
Channelinfoitem有consumer_count,messages_unacknowledged,messages_uncommitted,acks_uncommitted,messages_unconfirmed,prefetch_count,client_flow_blocked
RabbitMQ docker搭建高可用集群
在多台机器之间部署rabbitmq的cluster,要求如下:这几个节点需要再同一个局域网内;这几个节点需要有相同的erlang cookie,否则不能正常通信,
https://blog.csdn.net/qq_28533563/article/details/107932737 传统部署高可用
(拷贝.cookie
时,各节点都必须停止MQ服务)
RabbitMQ 有三种模式:单机模式,普通集群模式,镜像集群模式。单机模式即单独运行一个 rabbitmq 实例,而集群模式需要创建多个 rabbitmq实例。
1、普通集群模式
概念:
默认的集群模式。需要创建多个 RabbitMQ 节点。但对于 Queue 和消息来说,只存在于其中一个节点,其他节点仅同步元数据,即队列的结构信息。
当消息进入Queue后,如果 Consumer 从创建Queue的这个节点消费消息时,可以直接取出来;但如果 consumer 连接的是其他节点,那 rabbitmq 会把 queue 中的消息从创建它的节点中取出并经过连接节点转发后再发送给consumer。
所以 consumer 应尽量连接每一个节点。并针对同一个逻辑队列,要在多个节点建立物理 Queue。否则无论 consumer 连接哪个节点,都会从创建 queue 的节点获取消息,会产生瓶颈。
特点:
(1)Exchange 的元数据信息在所有节点上是一致的,而 Queue(存放消息的队列)的完整数据则只会存在于创建它的那个节点上。其他节点只知道这个 queue 的 metadata 信息和一个指向 queue 的 owner node 的指针;
(2)RabbitMQ 集群会始终同步四种类型的内部元数据(类似索引):
a.队列元数据:队列名称和它的属性;
b.交换器元数据:交换器名称、类型和属性;
c.绑定元数据:一张简单的表格展示了如何将消息路由到队列;
d.vhost元数据:为 vhost 内的队列、交换器和绑定提供命名空间和安全属性;
因此,当用户访问其中任何一个 RabbitMQ 节点时,通过 rabbitmqctl 查询到的元数据信息都是相同的。
(3)无法实现高可用性,当创建 queue 的节点故障后,其他节点是无法取到消息实体的。如果做了消息持久化,那么得等创建 queue 的节点恢复后,才可以被消费。如果没有持久化的话,就会产生消息丢失的现象。
2、镜像集群模式
概念:
把队列做成镜像队列,让各队列存在于多个节点中,属于 RabbitMQ 的高可用性方案。镜像模式和普通模式的不同在于,queue和 message 会在集群各节点之间同步,而不是在 consumer 获取数据时临时拉取。
特点: (1)实现了高可用性。部分节点挂掉后,不会影响 rabbitmq 的使用。
(2)降低了系统性能。镜像队列数量过多,大量的消息同步也会加大网络带宽开销。
(3)适合对可用性要求较高的业务场景。
普通集群部署
https://www.cnblogs.com/alan6/p/11691229.html docker部署高可用
https://blog.csdn.net/belonghuang157405/article/details/83540148
环境:
192.168.137.{7,6,5}
# cat /etc/hosts #解析主机名,后面加入集群需要使用
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.137.7 master
192.168.137.6 node01
192.168.137.5 node02
一、拉取rabbitmq镜像(每个机器上都要执行)
docker pull rabbitmq:3.8-management
二、创建映射数据卷目录(每个机器上都要执行)
mkdir -p /data/rabbitmqcluster
cd /data/rabbitmqcluster
mkdir -p rabbitmq
三、启动rabbitmq容器
192.168.137.7机器上执行:
docker run -itd --hostname `hostname` \
--name rabbitmq1 \
--restart always \
--network host \
--privileged=true \
-v /data/rabbitmqcluster/rabbitmq:/var/lib/rabbitmq \
-e RABBITMQ_ERLANG_COOKIE='WSGIJHFHFK' \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
rabbitmq:3.8-management
192.168.137.6机器上执行:
docker run -d --hostname `hostname` \
--name rabbitmq2 \
--restart always \
--network host \
--privileged=true \
-v /data/rabbitmqcluster/rabbitmq:/var/lib/rabbitmq \
-e RABBITMQ_ERLANG_COOKIE='WSGIJHFHFK' \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
rabbitmq:3.8-management
192.168.137.5机器上执行:
docker run -d --hostname `hostname` \
--name rabbitmq3 \
--restart always \
--network host \
--privileged=true \
-v /data/rabbitmqcluster/rabbitmq:/var/lib/rabbitmq \
-e RABBITMQ_ERLANG_COOKIE='WSGIJHFHFK' \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
rabbitmq:3.8-management
主要参数:
netstat -lntup|egrep "epmd|beam"
-p 15672:15672 \ # management 界面管理访问端口
-p 25672:25672 \ #集群通信地址
-p 5672:5672 \ # amqp 访问端口
-p 4369:4369 \
Erlang Cookie 值必须相同,也就是一个集群内 RABBITMQ_ERLANG_COOKIE 参数的值必须相同。因为 RabbitMQ 是用Erlang实现的,Erlang Cookie 相当于不同节点之间通讯的密钥,Erlang节点通过交换 Erlang Cookie 获得认证。
四、加入节点到集群
RabbitMQ 集群的搭建需要选择其中任意一个节点为基准,将其它节点逐步加入。
这里我们以 master 为基准节点,将 node01 和 node02 加入集群。
在 node01 和 node02 上执行以下命令:
# 1.停止服务
rabbitmqctl stop_app
# 2.重置状态
rabbitmqctl reset
# 3.节点加入, 在一个node加入cluster之前,必须先停止该node的rabbitmq应用,即先执行stop_app
# node01 加入 master, node02 加入master
rabbitmqctl join_cluster rabbit@master
# 4.启动服务
rabbitmqctl start_app
设置master:
docker exec -it rabbitmq1 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit
设置 node01,加入到集群:
docker exec -it rabbitmq2 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@master
rabbitmqctl start_app
exit
设置node02,加入到集群:
docker exec -it rabbitmq3 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@master
rabbitmqctl start_app
exit
主要参数:
-
--ram
表示设置为内存节点,忽略此参数默认为磁盘节点。该配置启动了3个节点,1个磁盘节点和2个内存节点。设置好之后,使用 http://ip:15672 进行访问,账号密码:admin/admin
-
join_cluster 命令有一个可选的参数
--ram
,该参数代表新加入的节点是内存节点,默认是磁盘节点。
如果是内存节点,则所有的队列、交换器、绑定关系、用户、访问权限和 vhost 的元数据都将存储在内存中
如果是磁盘节点,则存储在磁盘中。
内存节点可以有更高的性能,但其重启后所有配置信息都会丢失,因此RabbitMQ 要求在集群中至少有一个磁盘节点,其他节点可以是内存节点。当内存节点离开集群时,它可以将变更通知到至少一个磁盘节点;然后在其重启时,再连接到磁盘节点上获取元数据信息。除非是将 RabbitMQ 用于 RPC 这种需要超低延迟的场景,否则在大多数情况下,RabbitMQ 的性能都是够用的,可以采用默认的磁盘节点的形式。
这里为了演示, node02 我就设置为内存节点。
另外,如果节点以磁盘节点的形式加入,则需要先使用 reset 命令进行重置,然后才能加入现有群集,重置节点会删除该节点上存在的所有的历史资源和数据。采用内存节点的形式加入时可以略过 reset 这一步,因为内存上的数据本身就不是持久化的。
详解在RabbitMQ集群中有内存节点和磁盘节点之分:
- 内存节点(ram):就是将元数据都放在内存里,内存节点的话,只要服务重启,该节点的所有数据将会丢失
- 硬盘节点(disc):就是将元数据都放在硬盘里,所以服务重启的话,数据也还是会存在的,所以像我们的持久化消息、持久化队列等,都会放置硬盘节点保存
在RabbitMQ集群里,至少有一个磁盘节点,它用来持久保存我们的元数据,如果RabbitMQ是单节点运行,则默认就是磁盘节点。但是为了提高性能,其实不需要所有节点都是disc的节点,根据需求分配即可
#通过命令修改节点的类型 [disc | ram]
#如果集群已经搭建好,可以使用命令 rabbitmqctl change_cluster_node_type {disc,ram} 切换节点类型。
#下面将 node02更改为磁盘节点类型:
[root@node02~]# rabbitmqctl stop_app
[root@node02~]# rabbitmqctl change_cluster_node_type disc
[root@node02~]# rabbitmqctl start_app
镜像集群部署
1、策略policy概念
使用RabbitMQ镜像功能,需要基于RabbitMQ策略来实现,策略policy是用来控制和修改群集范围的某个vhost队列行为和Exchange行为。策略policy就是要设置哪些Exchange或者queue的数据需要复制、同步,以及如何复制同步。
为了使队列成为镜像队列,需要创建一个策略来匹配队列,设置策略有两个键ha-mode
和ha-params
(可选)。ha-params
根据ha-mode设置不同的值,下表说明这些key的选项。
- ha-mode:all 代表mq中包括交换器、元数据、队列等信息均进行多节点的镜像存储,在集群中所有的节点上进行镜像
- ha-sync-mode: automatic代表整个同步过程是自动的,在集群节点宕机重新连接后自动同步
最后,实现镜像模式集群。进入rabbitmq1容器中
docker exec -it rabbitmq1 bash
执行如下命令:ha-all
为策略名称,ha-mode
为同步模式。(当然也可以在界面上添加)
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all", "ha-sync-mode": "automatic"}'
说明:在cluster中任意节点启用策略,策略会自动同步到集群节点
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all", "ha-sync-mode": "automatic"}'
这行命令在vhost创建了一个策略,策略名称为ha-all queue,策略模式为 all 即复制到所有节点,包含新增节点,策略正则表达式为 "\^"
表示匹配所有队列名称。
例如:
rabbitmqctl set_policy ha-all "^message" '{"ha-mode":"all", "ha-sync-mode": "automatic"}'
备注:"\^message"
这个规则要根据自己修改,这个是指同步message
开头的队列名称,我们配置时使用的应用于所有队列,所以表达式为"\^"
===========================================================================
界面上添加策略
登录rabbitmq管理页面 -->
Admin -->
Policies -->
Add / update a policy
- Name:随便取,策略名称
- Pattern:
^
匹配符,只有一个^
代表匹配所有 - Definition:
ha-mode=all
为匹配类型,分为3种模式:all
(表示所有的queue)
查看效果
此策略会同步所在同一VHost中的交换器和队列数据。设置好policy之后,使用 http://ip:15672 再次进行访问,可以看到队列镜像同步
Rabbitmq网络分片
集群操作命令汇总
rabbitmq查看集群状态信息
rabbitmqctl cluster_status
启动rabbitmq
rabbitmqctl start_app
停止rabbitmq
rabbitmqctl stop_app
rabbitmq 查看策略
rabbitmqctl list_policies
rabbitmq 查看所有队列信息
rabbitmqctl list_queues
还原 rabbitmq 清除所有队列
rabbitmqctl reset
rabbitmq 查看用户
rabbitmqctl list_users
rabbitmq添加用户
rabbitmqctl add_user admin admin
rabbitmq设置admin用户权限
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
移除某个集群节点:一般情况当节点故障时,在正常的节点中,移除该故障节点
rabbitmqctl -n rabbit@rabbitmq01 forget_cluster_node rabbit@rabbitmq03
如果需要使用网桥模式部署rabbitmq
docker run -d --hostname rabbitmq-171 --add-host="rabbitmq-171":10.0.1.171 --add-host="rabbitmq-172":10.0.1.172 --name rabbitmq-171 --restart=always -p "4369:4369" -p "5672:5672" -p "15672:15672" -p "25672:25672" -v /data/rabbitmqdata:/var/lib/rabbitmq:z -e RABBITMQ_ERLANG_COOKIE='rabbitClusterCookie' 10.0.1.171:5000/mid/rabbitmq:management
docker run -d --hostname rabbitmq-172 --add-host="rabbitmq-171":10.0.1.171 --add-host="rabbitmq-172":10.0.1.172 --name rabbitmq-172 --restart=always -p "4369:4369" -p "5672:5672" -p "15672:15672" -p "25672:25672" -v /data/rabbitmqdata:/var/lib/rabbitmq:z -e RABBITMQ_ERLANG_COOKIE='rabbitClusterCookie' 10.0.1.171:5000/mid/rabbitmq:management
rabbitmq监控
另外一个rabbitmq的监控插件,请参考 rmqmonitor, issue
https://github.com/barryz/rmqmonitor
https://github.com/open-falcon/falcon-plus/issues/443
rabbitmq插件
rabbitmq_delayed_message_exchange
延迟插件
如果yum安装的rabbitmq,先rpm -ql rabbitmq-server
,找到plugins目录下,然后把下载好的插件copy到plugins目录。最后启动插件rabbitmq-plugins enable rabbitmq_delayed_message_exchange
免责声明: 本文部分内容转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除。