RabbitMQ
MQ 全称Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于系统之间的异步通信。RabbitMQ是基于Erlang语言开发的开源消息通信中间件,官网地址:
Messaging that just works — RabbitMQ
RabbitMQ对应的架构如图:
其中包含几个概念:
publisher
:生产者,也就是发送消息的一方consumer
:消费者,也就是消费消息的一方queue
:队列,存储消息。生产者投递的消息会暂存在消息队列中,等待消费者处理exchange
:交换机,负责消息路由。生产者发送的消息由交换机决定投递到哪个队列。virtual host
:虚拟主机,起到数据隔离的作用。每个虚拟主机相互独立,有各自的exchange
、queue
安装
这里是基于Docker来安装RabbitMQ,安装命令:
docker run \
-e RABBITMQ_DEFAULT_USER=hink \
-e RABBITMQ_DEFAULT_PASS=123456 \
-v mq-plugins:/plugins \
--name mq \
--hostname mq \
-p 15672:15672 \
-p 5672:5672 \
--network mynet
-d \
rabbitmq
-e RABBITMQ_DEFAULT_USER=hink
: 设置环境变量RABBITMQ_DEFAULT_USER
的值为hink
。-e RABBITMQ_DEFAULT_PASS=123456
: 设置环境变量RABBITMQ_DEFAULT_PASS
的值为123456
。-v mq-plugins:/plugins
: 挂载主机上的mq-plugins
目录到容器内的/plugins
目录。--name mq
: 设置容器的名称为mq
。--hostname mq
: 设置容器的主机名为mq
。-p 15672:15672
: 将容器的 15672 端口映射到主机的 15672 端口。(主机的端口:容器的端口)-p 5672:5672
: 将容器的 5672 端口映射到主机的 5672 端口。--network mynet
: 将容器连接到名为mynet
的网络。要提前创建好这个网络。-d
: 以“后台”模式运行容器。
其中两个端口的解释:
15672
:RabbitMQ提供的管理控制台的端口,我们可以访问这个端口进入控制台5672
:RabbitMQ的消息发送处理接口
交换机类型
Exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失!
交换机的类型有四种:
- Fanout:广播,将消息交给所有绑定到交换机的队列。
- Direct:订阅,基于RoutingKey(路由key)发送给订阅了消息的队列
- Topic:通配符订阅,与Direct类似,只不过RoutingKey可以使用通配符
- Headers:头匹配,基于MQ的消息头匹配,用的较少。
1)Fanout
英文翻译是扇出,在MQ叫广播比较合适。它会把消息发送给所有绑定的队列。
2)Direct
根据消息的Routing Key
进行判断,只有队列的Routingkey
与消息的 Routing key
完全一致,才会接收到消息
3)Topic
Topic
类型的Exchange
与Direct
相比,都是可以根据RoutingKey
把消息路由到不同的队列。
只不过Topic
类型Exchange
可以让队列在绑定BindingKey
的时候使用通配符。
BindingKey
一般都是有一个或多个单词组成,多个单词之间以.
分割,例如: item.insert
通配符规则:
#
:匹配一个或多个词*
:匹配 一个词
举例:
item.#
:能够匹配item.spu.insert
或者item.spu
item.*
:只能匹配item.spu
尾言
个人学习笔记,有错误处之类的可以帮我指明。