RabbitMQ初学
RabbitMQ
消息队列在软件中的应用场景
-
异步处理上(优于原先的方式)
为什么优于呢?
- 首先,通常情况下,如上图我们其实不用消息队列的情况下,其实也可以不用100ms,不用allof即可
- 那么优势在哪呢?在它消息队列的额外特点(可靠性和削峰填谷),即可保证大多数消息也就是我们发送大多数的请求能达到准确达到同时它还会控制
-
应用解耦
-
流量控制
把对应的消息过多会存到队列中,之后依次发送到对应服务
大多数应用中,可通过消息服务中间件来提升系统异步通信,扩展解耦能力(解耦的相当大的优势在于我之后某个子服务更新换代后可以不用再改原代码,而可以直接通过消息队列来更改)
消息队列的重要概念
消息代理
即是消息队列的服务器,帮你代理一下
目的地
消息发送的终点或接收的位置(有别于接收方/消费者,不是接收方啊!是消息的暂存对象)
主要两种形式的目的地(一对一&一对多)
- 队列(点对点的通信模式):每个消息只由一个消费者读取
- 主题(topic):多个消费者可以订阅同一个主题,并且每个消费者都可以接收该主题上发送的消息
springboot的使用上
- @EnableRabbit开启支持
- 自动会导入RabbitAutoConfiguration
RabbitMq的核心概念
-
message:
就是我们发送的消息(要传给消费者的东西),包括消息头(类似http的消息头,放一些约定的东西:如routing-key(路由键),priority,delivery-mode(指出该消息可能需要持久性存储)),和消息体(放具体要传送的内容) -
Publisher:
消息的生产者,向交换器(指定发送哪个)发布消息的客户端程序
-
Exchange:
交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列
4类:direct(默认),fanout,topic,和headers,不同exchange转发消息策略有别 -
Queue
保存消息直到发送给消费者,消息的容器,也是消息的终点
-
Binding
绑定,用于消息队列和交换器之间的关联,一个绑定就是基于路由键将路由器和消息队列连接起来的路由规则,Exchange和Queue的绑定可以是多对多的关系
-
Connection
网络连接,如TCP
-
Channel
信道,AMQP命令都是通过信道发出去的,不管发布消息,订阅队列还是接收消息都是通过信道完成(对于操作系统来说建立和销毁TCP都是非常昂贵的开销,所以出了信道的概念,来复用一条TCP连接)
-
Consumer(从消息队列中获取信息的客户端)
-
Virtual Host:
虚拟主机(也就是一台消息队列服务器分出一个虚拟消息队列,两者互不干扰) -
Broker:(消息队列服务器实体)
核心图
Binding是交换机与队列的粘黏剂
疑问?消息队列如何知道是哪个Consumer需要消息呢?
Consumer需要去订阅topic或者queue,类似订牛奶,之后有牛奶就给你家送