RabbitMQ的主要优点:
1.erLang语言天生支持高并发
2.MQ的环境搭建比较简便
3.有着较好的消息确认机制以及消息的持久化
4.高度可定制的路由策略
5.页面管理方便,社区活跃度较高
RabbitMQ 实战
几个重要概念:
▷ Broker: 简单来说就是消息队列服务器实体。
▷ Exchange: 消息交换机,它指定消息按什么规则,路由到哪个队列。
▷ Queue: 消息队列载体,每个消息都会被投入到一个或多个队列。
▷ Binding: 绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
▷ Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
▷ vhost: 虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
▷ producer: 消息生产者,就是投递消息的程序。
▷ consumer: 消息消费者,就是接受消息的程序。
▷ channel: 消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
使用过程:
1.客户端连接到消息队列服务器,打开一个channel。
2.客户端声明一个exchange,并设置相关属性。
3.客户端声明一个queue,并设置相关属性。
4.客户端使用routing key,在exchange和queue之间建立好绑定关系。
5.客户端投递消息到exchange。
6.exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。
端口号作用
默认的端口15672
:rabbitmq管理平台端口号。 默认的端口5672
:rabbitmq消息中间内部通讯的端口。 默认的端口号25672
:rabbitmq集群的端口号
rabbitmq-plugins enable rabbitmq_management #启动管理插件,下次无需再手动启动该插件
rabbitmqctl list_users #查看当前有多少用户
rabbitmqctl add_user zhao 123456 #设置用户账号和密码
rabbitmqctl set_user_tags zhao administrator #设置权限
使用docker 搭建RabbitMQ集群
RabbitMQ集群中节点包含内存节点RAM、磁盘节点(Disk,消息持久化)、集群中至少有一个Disk节点。集群分为两种集群模式普通模式 和 镜像模式。
普通模式(默认)
对于普通模式,集群中各节点有相同的队列结构,但消息只会存在于集群中的一个节点,对于消费者来说,若消息进入A节点的Queue中,当从B节点拉取时,RabbitMQ会将消息从A中取出,并经过B发送给消费者。
应用场景:该模式更适合于消息无需持久化的场景,如日志队列。当队列非持久化,且创建该队列的节点宕机,客户端才可以重连集群其他节点,并重新创建队列。若为持久化只能等故障节点恢复。
缺点:无法解决单点故障问题。
镜像模式
与普通模式不同之处时消息实体会主动在镜像节点见同步,而不是在取数据时临时拉取,高可用;该模式下 镜像队列(mirror queue)有一套选举算法,即1个master、n个slaver。 生产者、消费者的请求都会转至master。
应用场景:可靠性要求较高场合,如下单、库存队列。
缺点:若镜像队列过多,且消息体量大,集群内部网络带宽将会被此种同步通讯所消耗。
单机部署
环境搭建(创建三个RabbitMQ节点)
mkdir -p ~/data/rabbitmq
cd ~/data/rabbitmq
mkdir rabbitmq01 rabbitmq02 rabbitmq03
docker network create --subnet 172.18.0.1/16 --gateway 172.18.0.1 mq-net
创建rabbitmq01节点容器
docker run -d --hostname rabbitmq01 --name rabbitmq01 \
-v /data/rabbitmq/rabbitmq01:/var/lib/rabbitmq \
-p 15672:15672 -p 5672:5672 \
-e RABBITMQ_ERLANG_COOKIE=rabbitcookie \
--net mq-net \
rabbitmq:management
创建rabbitmq02节点容器
docker run -d --hostname rabbitmq01 --name rabbitmq02 \
-v /data/rabbitmq/rabbitmq02:/var/lib/rabbitmq \
-p 15673:15672 -p 5673:5672 \
-e RABBITMQ_ERLANG_COOKIE=rabbitcookie \
--net mq-net \
--link rabbitmq01:rabbitmq01 rabbitmq:management
创建rabbitmq03节点容器
docker run -d --hostname rabbitmq03 --name rabbitmq03 \
-v /data/rabbitmq/rabbitmq03:/var/lib/rabbitmq \
-p 15674:15672 -p 5674:5672 -e RABBITMQ_ERLANG_COOKIE=rabbitcookie \
--net mq-net \
--link rabbitmq01:rabbitmq01 --link rabbitmq02:rabbitmq02 rabbitmq:management
注意:–hostname 设置容器主机名,
RABBITMQ_ERLANG_COOKIE
节点认证作用,集群部署需要同步该值,且值必须相同。多个容器之间使用“–link”连接,此属性不能少;
安装好后访问测试,使用http://192.168.235.14:15672 进行访问了,默认账号密码是guest/guest。
加入普通模式集群
1.进入rabbitmq01容器,重新初始化一下,如果是新安装则reset可以忽略重置。
docker exec -it rabbitmq01 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit
2.进入rabbitmq02容器,重新初始化一下,将02节点加入到集群中
docker exec -it rabbitmq02 bash
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram rabbit@rabbitmq01 #参数“--ram”表示设置为内存节点,忽略该参数默认为磁盘节点。
rabbitmqctl start_app
exit
3.进入rabbitmq03容器,重新初始化一下,将03节点加入到集群中
docker exec -it rabbitmq03 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
exit
如何列出支持的功能标志
当节点第一次启动时,默认情况下所有支持的功能标志都是启用的
。当一个节点升级到较新版本的RabbitMQ时,如果它是一个单独的节点,默认情况下会启用新功能标志,如果它属于一个集群,默认情况下会保持禁用状态。
要列出功能标志,请使用
rabbitmqctl list_feature_flags
为了提高表格的可读性,请切换到pretty_table格式化程序:
rabbitmqctl -q --formatter pretty_table list_feature_flags \
name state provided_by desc doc_url
这将生成如下所示的表格:
如上例所示,list_feature_flags命令接受要显示的列列表。可用的列有:
name: 功能标志的名称
state: 启用或禁用(如果功能标记已启用或禁用),不支持(如果群集中的一个或多个节点不知道此功能标记,因此无法启用)
provided_by: 提供特性标志的RabbitMQ组件或插件
desc: 功能标志的描述
doc_url: 了解有关功能标志的更多信息的网页的URL
stability: 指示功能标志是稳定的还是实验性的
What I’m saying is never wait!