一.MQ介绍
Message Queue (MQ)是一种跨进程的通信机制,用于在系统之间进行传递消息。MQ作为消息中间件,可以进行异步处理请求,从而减少请求响应时间和解耦
1.1 应用场景
1.1.1 系统之间通过MQ进行消息通信,异步解耦
多应用间通过消息队列对同一消息进行处理,避免调用接口失败导致整个过程失败。
1.1.2 异步处理消息
应用间并发处理消息,相比串行处理,减少处理时间;
比如用户注册,系统需要发送注册邮件,验证短信。MQ作为消息中间件,可以进行异步处理请求,从而减少请求响应时间。
1.1.3 肖锋限流
广泛应用于高并发系统中,避免流量过大导致处理请求阻塞的情况
二.RabbitMQ
RabbitMQ是支持多种消息协议,易于部署和使用的开源消息代理服务器,用于在分布式系统中存储转发消息。
RabbitMQ 是一个消息代理,用于在应用程序之间传递消息。它接收、存储并转发消息,允许不同的应用程序之间进行异步通信。
- 由以高性能、健壮以及可伸缩性出名的Erlang语言编写;
- 提供了成熟的高并发,高可用的解决方案 可以根据实际业务情况动态地扩展集群节点。
- 在集群中的机器上设置镜像,使得在部分节点出现问题的情况下仍然可用。
- 支持多种客户端语言,如:Python、Ruby、.NET、Java等,支持AJAX。
- RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息、集群中的节点等。
MQ产品 | 语言支持 | 并发量 | 消息回溯支持 | 性能 | 协议 | 可靠性 |
---|---|---|---|---|---|---|
RocketMQ | Java, C++ | 较高 | 支持 | 良好 | 自定义TCP | 良好 |
Kafka | Java | 非常高 | 不支持 | 卓越 | 自定义TCP | 良好 |
ActiveMQ | Java | 万级 | 不支持 | 一般 | JMS规范 | 较差 |
AMQP:RabbitMQ 实现了高级消息队列协议(AMQP),这是一个开放的、通用的消息协议,支持在分布式系统中可靠地传递消息。
- Producer:生产者,即消息的提供者,是发送消息的应用程序
- Consumer:消费者,即消息的使用者,接收并处理消息的应用程序。
- Message:消息,即进程之间进行通信的数据
- Queue:队列,即消息存放的容器,消息以先进先出的方式进行存储,生产者将消息发布到队列,而消费者则从队列中获取消息进行处理。
- 交换机:交换机是消息的分发中心,决定将消息路由到哪个队列。生产者将消息发送到交换机,交换机根据规则将消息路由到一个或多个队列。
- 绑定:绑定是交换机和队列之间的规则,它定义了如何将消息从交换机路由到特定的队列。
- 持久性:RabbitMQ 支持消息的持久性,确保即使在代理重新启动后,消息也不会丢失。
- Vhost:虚拟主机,用于存储消息队列。
- 虚拟主机vhost是AMQP概念的基础,RabbitMQ包含了开箱即用的默认虚拟主机"/“;
- vhost之间是绝对隔离,保障了队列和交换机的安全性。
2.1 mac下 Mq安装
使用homebrew安装rabbitmq
官方文档参考:
The Homebrew RabbitMQ Formula | RabbitMQmac 下的安装命令:
## 更新命令
brew update
## 查找
brew search rabbitmq
## 安装
brew install rabbitmq
## 安装好后,查看rabbitmq的安装信息:
brew info rabbitmq
## 后台启动的方式
brew services start rabbitmq
## 停止rabbit服务器
brew services stop rabbitmq
2.2 环境变量
Intel Macs,把CLI工具路径设置了软连接,在 /usr/local/sbin
;
Apple Silicon Macs,在 `/opt/homebrew/sbin ;
rabbitmq-defaults -> ../Cellar/rabbitmq/3.12.2/sbin/rabbitmq-defaults
rabbitmq-diagnostics -> ../Cellar/rabbitmq/3.12.2/sbin/rabbitmq-diagnostics
rabbitmq-env -> ../Cellar/rabbitmq/3.12.2/sbin/rabbitmq-env
rabbitmq-plugins -> ../Cellar/rabbitmq/3.12.2/sbin/rabbitmq-plugins
rabbitmq-queues -> ../Cellar/rabbitmq/3.12.2/sbin/rabbitmq-queues
rabbitmq-server -> ../Cellar/rabbitmq/3.12.2/sbin/rabbitmq-server
rabbitmq-streams -> ../Cellar/rabbitmq/3.12.2/sbin/rabbitmq-streams
rabbitmq-upgrade -> ../Cellar/rabbitmq/3.12.2/sbin/rabbitmq-upgrade
rabbitmqadmin -> ../Cellar/rabbitmq/3.12.2/sbin/rabbitmqadmin
rabbitmqctl -> ../Cellar/rabbitmq/3.12.2/sbin/rabbitmqctl
vmware-rabbitmq -> ../Cellar/rabbitmq/3.12.2/sbin/vmware-rabbitmq
如果上面的路径没有在PATH里,则需要添加一下:
# for macOS Intel
export PATH=$PATH:/usr/local/sbin
# for Apple Silicon
export PATH=$PATH:/opt/homebrew/sbin
2.3 启动:
#方式一:
brew services start rabbitmq;
#方式二:进入默认的安装目录下,手动启动
2.4 安装RabbitMQWeb管理界面
#默认情况下,rabbitmq是没有安装RabbitMQWeb管理界面及授权操作的
rabbitmq-plugins enable rabbitmq_management
端口 用处 5672 RabbitMQ通讯端口,也就是连接使用的端口 15672 RabbbitMQ管理界面端口,需要开启Management插件
说明:rabbitmq有一个默认账号和密码是:guest 默认情况只能在localhost本机下访问,所以需要添加一个远程登录的用户。
访问:http://ip:15672/本例子是安装本地的,所以这边访问地址:http://localhost:15672/
三、Rabbit管理段操作
3.1 进入管理界面
用户名:guest
密码:guest
前提:只有localhost才能访问
3.2创建用户:
#新建用户 rabbitmqctl add_user 账号 密码 #给用户分配操作权限 rabbitmqctl set_user_tags 账号 administrator #修改密码 rabbitmqctl change_password Username Newpassword 修改密码 #删除用户 rabbitmqctl delete_user Username 删除用户 #查看所有用户 rabbitmqctl list_users 查看用户清单 #为用户设置访问权限 rabbitmqctl set_permissions -p / 用户名 ".*" ".*" ".*" rabbitmqctl set_permissions -p / root ".*" ".*" ".*"
角色 | 权限说明 | ||
---|---|---|---|
超级管理员 | administrator | 用户可以做监控所能做的一切,管理用户、vhosts和权限,关闭其他用户的连接,并管理所有vhosts的策略和参数 | |
监控者 | monitoring | 可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等) | |
策略制定者 | policymaker | 可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。 | |
普通管理者 | management | 仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。 | |
其他 | 无法登陆管理控制台,通常就是普通的生产者和消费者。 |
3.3 创建 Virtual Hosts
选中 Admin 用户设置权限
四、队列的工作模式
模式 | 交换机 | 图例 | 说明 |
Simple简单模式 | 一个生产者对应一个消费者 | ||
work工作模式 | 一对多,每个消费者得到的消息唯一(work模式下最大发挥每个消费者的性能) | ||
发布订阅模式 | FANOUT | 一对多,生产者将消息发送给交换机,交换机再将消息转发给与之绑定的队列,发布订阅模式对应的交换机类型是FANOUT | |
Routing路由模式 | DIRECT | 一对多,可以根据指定的路由key,将消息发送给不同的队列,交换机类型是DIRECT | |
Topic主题模式 | Topic | 一对多,在Routing路由模式的基础上,可以使用通配符定义路由key * 匹配单个字符 # 匹配任意个字符 |
一个简单的一个消息推送到接收的流程,提供一个简单的图
黄色的圈圈就是我们的消息推送服务,将消息推送到 中间方框里面也就是 rabbitMq的服务器,然后经过服务器里面的交换机、队列等各种关系(后面会详细讲)将数据处理入列后,最终右边的蓝色圈圈消费者获取对应监听的消息。