RabbitMQ介绍
一,介绍
微妙级别
二,安装
- 镜像地址
# 选择带有managemet版本
daocloud.io/library/rabbitmq:management
- docker-compose
version: "3.1"
services:
rabbitmq:
image: daocloud.io/library/rabbitmq:management
restart: always
container_name: rabbitmq
ports:
- 5672:5672
- 15672:15672
volumes:
- ./data:/var/lib/rabbitmq
- 运行
docker-compose -f rabbitmq.yml
# 访问
127.0.0.1:15672
guest/guest
三,RabbitMQ架构
1.简单架构
1.Publisher-生产者:发布消息到RabbitMQ中的Exchange
2.Consumer-消费者: 监听RabbitMQ中的Queue中的消息
3.Exchange-交换机: 和生产者建立连接并接受生产者的消息
4.Queue-队列: Exchange会将消息分发到指定Queue,Queue和Consumer进行交互.
5.Routes-路由: 交换机以什么样的策略将消息发布到Queue中.
2.完整架构
1.生产者跟RabbitMQ的vhost建立连接.
2.生产者跟RabbitMQ的指定的Exchange建立Channel通道连接.
3.Exchange通过Routes策略将消息发布到Queue队列中(实际中有很多个Exchage和Queue).
4.消费者跟RabbitMQ的vhost建立连接.
5.消费者跟RabbitMQ的指定的Queue建立Channel通道连接,拿到Queue中最新消息.
PS: 一个队列中的消息,只会被一个消费者消费一次.
3.查看图形化界面并创建vhost
四,RabbitMQ的使用
1.通讯方式
2.交换机3中类型
FANOUT - 用于Publish/Subscribe通讯方式
DIRECT - 用于Routing通讯方式
TOPIC - 用于Topics通讯方式
3.交换机绑定
Exchanges和Queues,生产者和消费者都可以做绑定.
4.RabbitMQ各语言连接
https://www.rabbitmq.com/getstarted.html
5.Hello-World简单通讯方式
一个生产者,一个默认的交换机,一个队列,一个消费者
6.Work queues通讯方式
一个生产者,一个默认的交换机,一个队列,两个消费者(默认Erlang机制自动平均分配给消费者,代码里可以改为手动方式,根据消费能力去消费)
7.Publish/Subscribe通讯方式
一个生产者,一个自定义交换机(要绑定队列和交换机),两个队列,两个消费者(消费2次)
8.Routing通讯方式
一个生产者,一个自定义的交换机(同个交换机根据RoutingKey不同去绑定指定的队列),两个队列,两个消费者。
9.Topics通讯方式
一个生产者,一个交换机,两个队列,两个消费者。
绑定通过*和#关键字来绑定队列,对指定RoutingKey内容,编写格式注意xxx.xxx.xx去编写.
*表示一个xxx(*.red.*) 匹配aaa.red.cc等
#表示多个xxx(fast.#) 匹配fast.aa.bb等
在发送消息时指定具体的RoutingKey到底是什么.
五.避免重复消费
1. 问题,业务是非幂等性操作-保证消息不会被重复消费
消费者消费了但没有给RabbitMQ一个ACK,另个消费者再去消费了.
解决,可以采用redis,在消费者消费之前,将消息id放到redis中,再给redis的id设置生存时间.
六.RabbitMQ中的用户角色权限
- 角色
在RabbitMQ中的用户角色主要分为五类:
超级管理员(administrator)、监控者(monitor)、决策制定者(policymaker)、普通管理者(management)和其他(none)。
每个角色对应的相应权限如下:
none:
不能登录管理控制台(启用management plugin的情况下,以下相同)
management:
用户可以通过AMQP做的任何事外加:
列出自己可以通过AMQP登入的virtual hosts
查看自己的virtual hosts中的queues, exchanges 和 bindings
查看和关闭自己的channels 和 connections
查看有关自己的virtual hosts的“全局”的统计信息,包含其他用户在这些virtual hosts中的活动
policymaker:
management的权限外加:
查看、创建和删除自己的virtual hosts所属的policies和parameters
monitoring:
management的权限外加:
列出所有virtual hosts,包括他们不能登录的virtual hosts
查看其他用户的connections和channels
查看节点级别的数据如clustering和memory使用情况
查看真正的关于所有virtual hosts的全局的统计信息
administrator :
policymaker和monitoring的权限外加:
创建和删除virtual hosts
查看、创建和删除users
查看创建和删除permissions
关闭其他用户的connections
- 权限
用户仅能对其所能访问的virtual hosts中的资源进行操作。这里的资源指的是virtual hosts中的exchanges、queues等,操作包括对资源进行配置、写、读。配置权限可创建、删除、资源并修改资源的行为,写权限可向资源发送消息,读权限从资源获取消息。
正则表达式来匹配特定的资源,对何种资源具有配置、写、读的权限通过正则表达式来匹配,具体命令如下:
set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
其中,<conf> <write> <read>的位置分别用正则表达式来匹配特定的资源,如'^(amq\.gen.*|amq\.default)$'可以匹配exchange和queue,'^$'不匹配任何资源,空字符串 '' 是 '^$' 的同义词,在权限限制上效果是一样的.
官网: https://www.rabbitmq.com/rabbitmqctl.8.html#Access_Control
官网上设置用户权限例子。
例如,此命令指示 RabbitMQ 代理授予名为"janeway"的用户对名为"my-vhost"的虚拟主机的访问权限,对名称以"janeway-"开头的所有资源配置权限,并对所有资源具有写入和读取权限:
rabbitmqctl set_permissions -p my-vhost janeway "^janeway-.*" ".*" ".*" ".*"