RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而群集和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。
Rabbit科技有限公司开发了RabbitMQ,并提供对其的支持。起初,Rabbit科技是LSHIFT和CohesiveFT在2007年成立的合资企业,2010年4月被VMware旗下的SpringSource收购。RabbitMQ在2013年5月成为GoPivotal的一部分。
RabbitMQ是一套开源(MPL)的消息队列服务软件,是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成。
RabbitMQ服务支持下列操作系统:
Linux
WindowsNT 到 10
Windows Server2003 到 2016
macOS
Solaris
FreeBSD
TRU64
VxWorks
Python、Java、Ruby、PHP、C#、JavaScript、Go、Elixir、Objective-C、Swift
可伸缩性: 集群服务
消息持久化:从内存持久化消息到硬盘,再从硬盘加载到内存 [1]
Erlang与RabbitMQ,安装路径都应不含空格符。
Erlang使用了环境变量HOMEDRIVE与HOMEPATH来访问配置文件.erlang.cookie,应注意这两个环境变量的有效性。需要设定环境变量ERLANG_HOME,并把%ERLANG_HOME%\bin加入到全局路径中。
4369 – erlang发现口
5672 --client端通信口
15672 – 管理界面ui端口
25672 – server间内部通信口
Broker:提供一种 传输服务,维护从生产者到消费者的路线,保证数据按照指定的方式传输
Producer:消息生产者
Consumer: 消息消费者
Exchange: 消息交换机,指定消息按照什么规则,进入那个队列
Queue: 消息队列,消息的载体
Binding:一个动作,把exchange和queue按照路由规则进行绑定
Routing key:路由关键字,就是进行消息投递的规则
Vhost:虚拟主机,用于分离不同用户的权限
Channel:消息通道,一个链接里可以建立多个通道
Producer与rabbitmq server 建立链接
在建立链接的基础上,建立channel(消息通道)
Producer 定义一个exchange和queue
Producer 传递消息给exchange,同时还会传送一个routing key
Exchange 根据routing key 把消息投递到相应的队列
Queue收到消息之后,把消息发送给订阅者------consumer
Consumer拿到消息之后,发送一个确认消息----ack 给rabbitmq
Rabbit获得来自consumer的ack之后,确认消息已经被消费,删除掉队列中对应的消息。
普通模式(默认):消息只有一份
镜像模式:消息在多个节点上,消息会主动在节点之间进行同步
缺点:如果消息过多,会损耗通讯信道、降低系统性能
ha-mode : 表示镜像模式 all / exactly / nodes
-all : 表示消息在集群所有节点上进行镜像
-exactly: 在指定个数的节点上进行镜像
-nodes:在指定的节点上进行镜像,节点需要指定
ha-sync-mode:automatic / manual 队列中消息的同步方式
内存节点: 保存状态到内存中
硬盘节点: 保存状态到硬盘中
集群中,一个磁盘节点就可以,这样的配置,速度快,数据也可以持久化到磁盘
注意点:
Rabbitmq从2.0版本开始支持拒绝消息,如果拒绝消息 ,那么消息会被发送给下一个consumer
一个链接上可以建立多个channel,可以理解为逻辑上的链接,也就是我们说的消息通道
dead-letter: dead-letter = requeue-false 直接抛弃异常数据,而不是重新进入队列,重新进入队列可能会造成消息积压在队列中,压力较大
关于vhost的理解: vhost可以为不同的服务提供边界隔离,使得应用安全的运行在不同的vhost上,相互之间不会干扰,producer和consumer链接rabbitmq,需要指定一个vhost,表明在同一个vhost下进行通信
yum -y localinstall erlang-19.0.4-1.el7.centos.x86_64.rpm rabbitmq-server-3.6.10-1.el7.noarch.rpm
在n台服务器中安装erlang与rabbitmq会解决依赖包socat
systemctl stop firewalld 关闭防火墙
systemctl disable firewalld 禁止防火墙
192.168.1.* s1 添加IP及更改主机名称
192.168.1.* s2 ~
192.168.1.* s3 ~
操作完成后reboot重启
cat /var/lib/rabbitmq/.erlang.cookie 查看第一台cookie的值,并把其他机器的值设置与其相同
echo "OWFLSWVBIBSTQPTNPYIK" > /var/lib/rabbitmq/.erlang.cookie
systemctl start rabbitmq-server 全部启动
[root@s1 ~]# rabbitmqctl stop_app 停掉内部应用
Stopping rabbit application on node rabbit@s1
[root@s1 ~]# rabbitmqctl reset 重置
Resetting node rabbit@s1
[root@s1 ~]# rabbitmqctl start_app 启动内部应用
Starting node rabbit@s1
[root@s2 ~]# rabbitmqctl stop_app 停掉内部应用
Stopping rabbit application on node rabbit@s2
[root@s2 ~]# rabbitmqctl reset 重置
Resetting node rabbit@s2
[root@s2 ~]# rabbitmqctl join_cluster --ram rabbit@s1 创建一个集群 ram内存节点
Clustering node rabbit@s2 with rabbit@s1
[root@s2 ~]# rabbitmqctl start_app 启动内部应用
Starting node rabbit@s2
[root@s2 ~]#
[root@s2 ~]# rabbitmqctl cluster_status 显示cluster中的所有node
Cluster status of node rabbit@s2
[{nodes,[{disc,[rabbit@s1]},{ram,[rabbit@s3,rabbit@s2]}]},
{running_nodes,[rabbit@s3,rabbit@s1,rabbit@s2]},
{cluster_name,<<"rabbit@s2">>},
{partitions,[]},
{alarms,[{rabbit@s3,[]},{rabbit@s1,[]},{rabbit@s2,[]}]}]
rabbitmq支持各种插件,开启插件可以使用rabbitmq-plugins命令
rabbitmq_management提供一个基于HTTP的API接口,来管理和监控你的rabbitmq。他有web方式和CLI方式,其实web方式是在后端调用HTTP api
[root@s1 ~]# rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
amqp_client
cowlib
cowboy
rabbitmq_web_dispatch
rabbitmq_management_agent
rabbitmq_management
Applying plugin configuration to rabbit@s1... started 6 plugins.
[root@s1 ~]# rabbitmqctl add_user szd 123.com 添加一个 用户、密码
Creating user "admin"
[root@s1 ~]# rabbitmqctl set_user_tags szd administrator 设置一个账户为管理员
Setting tags for user "admin" to [administrat]