RabbitMQ
# 安装
# RabbitMQ安装
官网下载地址:https://www.rabbitmq.com/download.html
需要下载两个包
rabbitmq-server-3.8.8-1.el7.noarch.rpm
erlang-21.3.8.21-1.el7.x86_64.rpm
# 1.安装
rpm -ivh erlang-21.3.8.21-1.el7.x86_64.rpm
yum install socat -y
rpm -ivh rabbitmq-server-3.8.8-1.el7.noarch.rpm
# 2.启动
# 启动服务
systemctl start rabbitmq-server
# 查看服务状态
systemctl status rabbitmq-server
# 开机自启动
systemctl enable rabbitmq-server
# 停止服务
systemctl stop rabbitmq-server
# 重启服务
systemctl restart rabbitmq-server
# 3.开放端口
# 如果防火墙是关闭状态需要开放 15672 和 5672 端口
firewall-cmd --list-ports
# 添加
firewall-cmd --add-port=15672/tcp --permanent
firewall-cmd --add-port=5672/tcp --permanent
# 载入
firewall-cmd --reload
# Web管理界面安装
rabbitmq-plugins enable rabbitmq_management
# 安装完成重启
systemctl restart rabbitmq-server
# 登录
http://ip:15672 ,用默认账号密码(guest)登录,提示User can only log in via localhost,默认情况只能在 localhost 本机下访问,需要添加一个远程登录的用户
# 创建账号和密码
rabbitmqctl add_user admin 123456
# 设置用户角色
rabbitmqctl set_user_tags admin administrator
# 为用户添加资源权限 set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
# 为admin添加配置、写、读权限
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
用户级别:
- administrator:可以登录控制台、查看所有信息、可以对 rabbitmq 进行管理
- monitoring:监控者 登录控制台,查看所有信息
- policymaker:策略制定者 登录控制台,指定策略
- managment:普通管理员 登录控制台
# 命令
1.启动RabbitMQ和Erlang
rabbitmq-server -detached
该命令会同时启动rabbit应用程序和Erlang节点,如果MQ相关插件是开启状态
2.停止RabbitMQ和Erlang
rabbitmqctl stop
用于停止RabbitMQ的Erlang虚拟机和RabbitMQ服务应用
当使用该命令停止节点后,就必须使用rabbitmq-server -detached才能将我们的节点启动起来
3.停止RabbitMQ应用
rabbitmqctl stop_app
停止rabbitmq服务应用,但是erlang虚拟机还是处于运行状态的
4.启动RabbitMQ应用
rabbitmqctl start_app
所以该命令在使用rabbitmqctl stop_app时可以使用
5.重置应用
注:改命令需要在rabbitmqctl stop_app之后使用
rabbitmqctl reset
该命令会将rabbit节点重置还原到最初状态,包括从原来所在集群删除此节点,包括其所有配置数据(用户、vhost等)
6.查看vhost列表
rabbitmqctl list_vhosts
7.查看节点状态
rabbitmqctl status
8.查看插件
rabbitmq-plugins list
9.开启rabbitmq web页面插件功能
rabbitmq-plugins enable rabbitmq_management
10.关闭rabbitmq web页面插件*功能*
rabbitmq-plugins disable rabbitmq_management
11.查看所有队列信息
rabbitmqctl list_queues
12.清除某个队列里的消息
rabbitmqctl -p [vhostpath] purge_queue [queue_name]
13.删除队列
rabbitmqctl -p [vhostpath] delete_queue [queue_name]
# 概念
MQ(Message Queue)消息队列,是基础数据结构中“先进先出”的一种数据结构。一般用来解决应用解耦,消息分发,流量削峰等问题,实现高性能,高可用,可伸缩和最终一致性架构。
# 常见中间件

# 应用场景
- **异步解耦:**如果在进行一系列操作时其中某几步不需要同步进行可以选择发送消息给MQ进行异步操作

- **削峰填谷:**如果某一刻访问量急速增加可能会导致系统崩溃,此时可以选择发送消息给MQ进行处理

- **消息分发:**在实际开发中一个A系统的数据有的时候需要分发个不同的系统中,如果出现一个新的系统需要A系统数据那么则需要修改业务逻辑,此时可以选择将A系统消息数据发送给MQ,有需要的系统可以直接选择到MQ中获取,A系统则不需要关心消息分发给谁
# 使用劣势
- 系统可用性降低 系统引用的外部依赖越多,系统的稳定性就会越差,如果MQ中途宕机了则会对业务造成影响,需要保证MQ的高可用
- 系统复杂度提高 之前是系统之间的调用现在则需要在中间由MQ进行调用,需要解决MQ的消息重复消费问题,消息丢失问题,消息传递的顺序性问题
- 系统一致性问题 A系统通过MQ给BCD三个系统发送消息,如果BC成功D失败需要保证消息处理的一致性
# RabbitMQ流程
Broker:接收和分发消息的应用,RabbitMQ Server就是 Message Broker
Virtual host:出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似于网 络中的 namespace 概念。当多个不同的用户使用同一个RabbitMQ server 提供的服务时,可以划分出多个vhost,每个用户在自己的 vhost 创建 exchange/queue 等
Connection:publisher/consumer 和 broker 之间的 TCP 连接
Channel:如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCP Connection 的开销将是巨大的,效率也较低。Channel 是在connection 内部建立的逻辑连接,如果应用程序支持多线 程,通常每个thread创建单独的 channel 进行通讯,AMQP method 包含了channel id 帮助客户端和 message broker 识别 channel,所以 channel 之间是完全隔离的。Channel 作为轻量级的 Connection 极大减少了操作系统建立 TCP connection 的开销。
Exchange:message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发消息到 queue 中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)
Queue:消息最终被送到这里等待 consumer 取走
Binding:exchange 和 queue 之间的虚拟连接,binding 中可以包含 routing key。Binding 信息被保存 到 exchange 中的查询表中,用于 message 的分发依据

# 工作模式
# 简单模式
一个生产者,一个消费者,使用默认的交换机,适用于一对一的消息传递
# 工作队列模式
有一个或多个生产者将任务发布到队列中,而多个消费者从队列中获取任务并进行处理。每个任务只能被一个消费者处理,确保任务的唯一性和可靠性
# 发布订阅模式
有一个或多个生产者将消息发布到交换机(Exchange)中,而多个消费者通过绑定队列(Queue)到交换机上来接收消息。交换机负责将消息广播给所有绑定的队列,每个消费者都会收到一份消息副本。
# 路由模式
有一个或多个生产者将消息发布到交换机(Exchange)中,而交换机根据消息的路由键将消息发送到特定的队列。消费者通过绑定队列到交换机上来接收消息,只有与绑定时指定的路由键匹配的消息才会被消费者接收
# 通配符模式
生产者将消息发布到交换机(Exchange)中,并且消息的路由键(Routing Key)是一个字符串,可以包含通配符。交换机根据消息的路由键将消息发送到与之匹配的队列。消费者通过绑定队列到交换机上来接收消息,只有与绑定时指定的路由键匹配的消息才会被消费者接收。
在Topic模式中,路由键可以使用两种通配符:
*
:匹配一个单词,例如topic.*
可以匹配topic.a
、topic.b
等。#
:匹配零个或多个单词,例如topic.#
可以匹配topic.a
、topic.a.b
、topic.a.b.c
等。