浅谈 RabbitMQ(一)工作模型与 Exchange 类型
为什么要使用MQ
异步
同步请求与响应方式:服务A请求服务B,在得到响应结果前,服务A必须阻塞等待,极大影响了吞吐量(TPS)
服务异步请求方式:服务A发起请求,然后进行其它任务,收到服务B的响应后继续进行相应的业务
解耦
多个服务之间通过MQ传输消息,减少耦合性
削峰
大量的请求如果直接访问服务,会导致服务宕机等问题,使用MQ可达到缓冲削峰的作用
RabbitMQ工作模型
基于AMQP(高级消息队列协议),可跨平台
Message
消息:即服务间传输的数据
Producer
消息生产(提供)者:向交换机发送消息的服务
Exchange
交换机:接收消息生产者发送的消息并路由转发给队列
Binding
绑定:交换机和队列的一种关联形式,一个绑定可以理解为匹配一个队列的规则
Queue
队列:保存消息并发送给消费者,存储消息的容器,一个消息可以发送给多个队列
Connection
网络连接:比如TCP连接(长连接)
Channel
信道:数据流通道,TCP长连接的开启与销毁都是非常昂贵的资源消耗,通过通道可以达到多路复用的作用(底层NIO)
Broker
主机:真正的消息队列服务实体
Consumer
消费者:从消息队列中获取消息并使用
VHost(Virtual Host)
虚拟主机:一批交换机、队列和绑定等的组合,可以理解为一个mini版的RabbitMQ,实现在同一个MQ中的资源隔离(类似于容器化)。连接时必须指定VHost,默认的VHost是"/"
Exchange路由类型
消息提供者将消息发送给Exchange路由(转发)给各个Queue
Direct Exchange(直连)
直连类型:使用Binding Key将Queue绑定到Direct Exchange,消息提供者发送消息时使用Routing Key发送到指定的交换机,交换机转发给对应的Queue,消费者通过监听相应的Queue获取并消费消息。
依据上图的规则举个栗子:
- 当Routing Key=queue_A时,消息会发送到QueueA队列;
- 当Routing Key=queue_B时,消息会发送到QueueB队列;
- 当Routing Key=queue_C时,消息会发送到QueueC队列。
Topic Exchange(主题)
最灵活的类型,Binding Key可以使用通配符限定Routing Key
# 表示匹配0个或多个单词
* 表示只能匹配1个单词
. 起到在Binding Key分隔单词的作用, 用于通配符的匹配规则
主题类型:使用Binding Key将消息转发给多个Queue
依据上图的规则举个栗子:
- 当Routing Key=netty.first时,消息会发送到QueueA队列;
- 当Routing Key=netty.first.second时,消息会发送到QueueA队列;
- 当Routing Key=tomcat.first时,消息会发送到QueueB队列;
- 当Routing Key=first.mysql时,消息会发送到QueueC队列;
- 当Routing Key=first.second.mysql时,消息会发送到QueueC队列;
Fanout Exchange(广播)
广播类型没有Binding Key和Routing Key
广播类型:消息提供者将消息发送给Fanout Exchange后会转发给绑定到Fanout Exchange上的所有Queue
依据上图的规则举个栗子:
- 当消息发送给广播类型的交换机后,所有绑定到该交换机的队列(QueueA、QueueB、QueueC)都将收到此消息
作者:超级鲨鱼辣椒
转载请注明原文链接:https://www.cnblogs.com/jinzlblog/p/15132692.html