AMQP简介
AMQP(Advanced Message Queuing Protocol),高级消息队列协议,是进程之间传递异步消息的网络协议。
AMQP工作过程
发布者(publisher)发布消息,交换机根据路由规则将受到消息分发给交换机绑定的队列,最后AMQP代理会将消息投递给订阅了此队列的消费者,或者消费者根据需求自行获取。
队列
队列是数据结构中概念。数据存储在一个队列中,数据是有顺序的,先进的先出,后进后出,其中一侧负责进数据,另一侧负责出数据。MQ很多功能都是基于队列结构实现的。
RabbitMQ介绍
RabbitMQ是由Erlang语言编写的基于AMQP的消息中间件,而消息中间件作为分布式系统重要组件之一,可以解决应用耦合,异步消息【可以通过异步的方式提升工作效率,异步无阻塞问题】,流量削峰【如电商抢购,让并发量降下来】等问题。
解耦合
1.1不适用MQ时
1.2使用MQ时
这样的话应用程序A和应用程序B就没有一个强耦合关系了,而是通过MQ作为桥梁来实现消息的互通。
RabbitMQ适用场景
排队算法:使用消息队列特性
秒杀活动:使用消息队列特性
消息分发:使用消息异步特性
异步处理:使用消息异步特性
数据同步:使用消息异步特性
处理耗时任务:使用消息异步特性
RabbitMQ原理
1.Message
消息,消息是不具名的,它由消息头消息体组成。消息体是不透明的,而消息头则由一系列可选属性组成,这些属性包括:routing-key(路由键)、priority(相对于其他消息的优先权)、deliverty-mode(指出消息可能持久性存储)等。
2.publisher
消息的生产者。也是一个向交换器发布消息的客户端应用程序。
3.consumer
消息的消费者。表示一个从消息队列中取得消息的客户端应用程序
4.Exchange
交换器。用来接收生产者发送的消息并将这些消息路由给服务器中的队列。三种常用的交换器类型 1.direct(发布与订阅 完全匹配)2.fanout(广播)3。topic(主题,匹配规则)
5.Binding
绑定。用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。
6.Queue
消息队列。用来保存消息知道发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列里面,等待消费者链接到这个队列将其取走。
7.Routing-key
路由键。RabbitMQ决定消息该投递到哪个队列的规则。(也可以理解为队列的名称,路由键是key,队列是value)队列通过路由键绑定到交换器。消息发送到MQ服务器时,消息将拥有一个路由键,即便是空的,RabbitMQ也会将其和绑定使用的路由键进行匹配。如果相匹配,消息将会投递到该队列。如果不匹配,消息将会进入黑洞。
8.Connection
链接。指rabbit服务器和服务建立的TCP连接。
交换器
交换器主要负责接收客户端传递过来的信息,并转发到对应的队列中,在RabbitMQ中支持四种交换器:
1.Direct Exchange 直连交换器(RabbitMQ默认交换器)
2.Fanout Exchange 扇形交换器
3.Topic Exchange 主题交换器
5.Header Exchange 首部交换器
前三种常用
direct交换器
默认会进行公平调度。所有接收者依次从消息队列中获取值,Publisher给哪个队列发消息,就一定是给哪个队列发消息。对交换器绑定的其他队列没有任何影响。
fanout交换器
扇形交换器,实际上做的事情就是广播,fanout会把消息发送给所有的绑定在当前交换器上的队列。且每个队列消息中第一个Consumer能收到消息。
需要使用的注解/API
FanoutExchange:fanout交换器
Binding:绑定交换器和队列
BindingBuilder:Binding的构建器
amq.fanout:内置fanout交换器名称
Topic交换器
允许在路由键(RoutingKey)中出现匹配规则
路由键的写法和包写法相同。com.xxx.xxx格式
在绑定时可以带有虾米那特殊符号,中间可以出现:
*:代表一个单词(两个.之间的内容)
#:0个或多个字符
接收方法依然是公平调度,同一个队列中内容轮换获取值
需要使用注解/API
TopicExchange:Topic交换器
amq.topic:内置topic交换器名称