介绍
RabbitMQ是 一个由erlang语言编写的、开源的,基于AMQP协议实现的消息队列,具有MQ应用解耦、流量削峰、异步的特点
官网地址 https://www.rabbitmq.com/
功能特点
支持顺序消息,保证消息送达消费端的前后顺序
支持消息补偿,重试,以及快速定位异常、失败消息
支持集群负载均衡
支持消息路由策略,指定某些消息路由到指定的队列
架构图
概念
Message
消息。由消息头消息体组成。消息体是不透明的,而消息头则由一系列可选属性组成,这些属性包括:routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出消息可能持久性存储)等。
Publisher
消息的生产者。也是一个向交换器发布消息的客户端应用程序。
Consumer
消息的消费者。表示一个从消息队列中取得消息的客户端应用程序。
Exchange
交换器。 Exchange是一个比较重要的概念,它是消息到达RabbitMQ的第一站,主要负责根据不同的分发规则将消息分发到不同的Queue,供订阅了相关Queue的消费者消费到指定的消息。
当我们创建好Exchange和Queue之后,需要使用Routing key(通常叫作Binding key)将它们绑定起来,producer在向Exchange发送一条消息的时候,必须指定一个Routing key,然后Exchange接收到这条消息之后,会解析Routing key,然后根据Exchange和Queue的绑定规则,将消息分发到符合规则的Queue中
分发消息的规则有4种
direct(直连)
direct的意思是直接的,direct类型的Exchange会将消息转发到指定Routing key的Queue上,Routing key的解析规则为精确匹配。也就是只有当producer发送的消息的Routing key与某个Binding key相等时,消息才会被分发到对应的Queue上。
假设向交换机MY_DIRECT_EXCHANGE中发送一条消息,消息的Routing key是ORDER,那么该条消息仅会被投递到MY_DIRECT_ORDER_QUEUE这个队列
fanout(广播)
fanout是扇形的意思,该类型通常叫作广播类型。fanout类型的Exchange不处理Routing key,而是会将发送给它的消息路由到所有与它绑定的Queue上
假设向交换机MY_FANOUT_EXCHANGE中发送一条消息,消息的Routing key任意填写一个值,该消息会被投递到三个队列中,所以 fanout类型的Exchange不管Routing key是什么,它都会将接收到的消息分发给所有与自己绑定了的Queue上。
topic(主题,规则匹配)
topic的意思是主题,topic类型的Exchange会根据通配符对Routing key进行匹配,只要Routing key满足某个通配符的条件,就会被路由到对应的Queue上。通配符的匹配规则如下:
- Routing key必须是一串字符串,每个单词用“.”分隔;
- 符号“#”表示匹配一个或多个单词;
- 符号“*”表示匹配一个单词。
eg:
“*.123” 能够匹配到 “abc.123”,但匹配不到 “abc.def.123”;“#.123” 既能够匹配到 “abc.123”,也能匹配到 “abc.def.123”
我们向交换机发送的消息会根据Routing key的匹配结果,路由到对应的消息队列
headers (Arguments参数)
headers Exchange中,Exchange与Queue之间的绑定不再通过Binding key绑定,而是通过Arguments绑定 。
producer在发送消息时可以添加headers属性,Exchange接收到消息后,会解析headers属性
只要Binding配置的Arguments中的所有属性全部被包含在Headers中并且值相等,那么这条消息就会被路由到对应的Queue中
Binding
绑定。用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。
Queue
消息队列。用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者链接到这个队列将其取走。
Routing-key
路由键。RabbitMQ 决定消息该投递到哪个队列的规则。队列通过路由键绑定到交换器。消息发送到 MQ 服务器时,消息将拥有一个路由键,即便是空的 ,RabbitMQ 也会将其和绑定使用的路由键进行匹配。如果相匹配,消息将会投递到该队列。如果不匹配,消息将会进入黑洞。
Connection
链接。指 rabbit 服务器和服务建立的 TCP 链接。 每个producer(生产者)或者consumer(消费者)要通过RabbitMQ发送与消费消息,首先就要与RabbitMQ建立连接,这个连接就是Connection。Connection是一个TCP长连接。
Channel
1.Channel 中文叫做信道,是 TCP 里面的虚拟链接。例如:电缆相当于 TCP,信道是一个独立光纤束,一条 TCP 连接上创建多条信道是没有问题的。
2.TCP 一旦打开,就会创建 AMQP 信道。
3.无论是 声明Queue、声明Exchang、 发布消息、接收消息、订阅队列,这些动作都是通过信道完成的。
Virtual Host
虚拟主机。 一个Broker中可以有多个Virtual host,每个Virtual host都有一套自己的Exchange和Queue,同一个Virtual host中的Exchange和Queue不能重名,不同的Virtual host中的Exchange和Queue名字可以一样。这样,不同的用户在访问同一个RabbitMQ Broker时,可以创建自己单独的Virtual host,然后在自己的Virtual host中创建Exchange和Queue,很好地做到了不同用户之间相互隔离的效果。 vhost 是AMQP 概念的基础,必须在链接时指定,RabbitMQ 默认的 vhost 是/。
Broker
表示消息队列服务器实体。
AMQP协议
AMQP协议本身分三层:
Moudle Layer:位于协议的最高层,主要定义了一些客户端的命令,客户端利用这些命令实现自己的业务逻辑。例如客户端使用Queue.Declare命令声明一个队列,或者使用Basic.Consume订阅消费一个队列的消息。
Session Layer:位于中间层,主要负责客户端命令发送给服务器,再将服务器应答返回客户端,主要为客户端和服务器之间通信提供可靠性同步机制和错误处理。
Transport Layer:位于最底层,主要传输二进制流,提供帧处理,信道复位,错误检测。
参考文章
https://baijiahao.baidu.com/s?id=1732891548341088166&wfr=spider&for=pc