消息队列MQ
“消息队列”是在消息的传输过程中 保存消息的容器
消息队列是一种集成接受数据,接受请求、存储数据、发送数据等功能的技术服务
能做什么
解耦
通过消息系统连接应用,数据放入MQ后,不用关心谁消费
系统/应用间相互不影响
异步
同步处理
用户点击发送邮件(0.5s) -> 系统发送邮件(5s) -> 界面显示已经发送(result)
用户得到响应的时间 0.5 + 5 = 5.5
使用消息队列异步处理
- 用户点击发送邮件(0.5s) -> 数据放入MQ(0.05s) -> 界面显示已经发送(result)
- 消费MQ中的数据,发送邮件(5s)
用户得到响应的时间 0.5 + 0.05 = 0.55
可以一边处理用户点击,一边发送邮件
提升用户体验
削峰
将某一段时间的超高流量分摊到更长的一段时间内去消化,避免了流量洪峰击垮系统。
1s/5000请求 -> 放入MQ
从MQ取出 -> 1s/2000消费
RabbitMQ
安装
Erlang
RabbitMQ
rabbitMQ与Erlang的对应版本
注意
- 选择正确的Erlang版本
- 以管理员身份安装Erlang
- 只安装一个Erlang版本
- 以管理员身份安装RabbitMQ(推荐)
- RabbitMQ安装路径不要有中文
cookie问题
需要替换cookie位置
RabbitMQ问题解决:TCP connection succeeded but Erlang distribution failed
常用命令
命令帮助文档
1 | rabbitmqctl help <commond> |
查看RabbitMQ启动状态
1 | rabbitmqctl status |
客户端管理UI插件
1 | rabbitmq-plugins enable rabbitmq_management |
添加用户
1 | rabbitmqctl add_user <username> <password> |
为用户分配角色
1 | rabbitmqctl set_user_tags <username> <role> |
设置用户权限
1 | rabbitmqctl set_permissions <username> <conf> <write> <read> |
查看用户列表
1 | rabbitmqctl list_users |
创建虚拟主机vhost
1 | rabbitmqctl add_vhost myvh |
查看虚拟主机vhost
列表
1 | rabbitmqctl list_vhosts |
核心概念
Virtual Host
每一个 RabbitMQ 服务器都能创建出许多虚拟的消息服务器,也就是虚拟主机Virtual Host
,
简称vhost
每一个vhost
都是一个独立的小型 RabbitMQ 服务器,这个 vhost 中会有自己的消息队列、消息交换机以及相应的绑定关系等等,并且拥有自己独立的权限,不同的 vhost 中的队列和交换机不能互相绑定,它们在逻辑上分离,类似环境隔离
交换机Exchange
交换机,接收消息,根据路由键发送消息到绑定的队列
不同的Exchange类型可以用于实现不同消息的模式
交换机类型
预设的7个交换机
(AMQP default)
默认交换机,默认绑定到所有消息队列
根据routing key
发送给同名的消息队列amq.direct
普通的直连交换机,可以自定绑定
根据routing key
寻找消息队列(可以自定义)
交换机特性
- D: 持久化
消息队列Queue
exclusive
是否排他
- 该队列仅对首次声明它的连接可见
- 基于Connection可见,同一Connection的不同Channel可以访问
- 不允许其他Connection创建同名排他队列
- 连接断开时自动删除,无论该队列是否持久化
auto delete自动删除
需要至少一个消费者连接到这个消息队列,没有消费者连接时自动删除
应答模式
- Nack message requeue true
拒绝消息,不会将消息取出,并且重新排队 - Automatic ack
确认应答,确认后消息会从队列中移除 - Reject requeue true
- Reject requeue false
信道Channel
网络信道,几乎所有的操作都在Channel中进行,是进行消息读写的通道
注意
消息队列接收到应答后,对应的消息将被删除,一般使用手动应答
一个消费者对应一个队列