RabbitMQ(基于AMQP协议,erlang语言开发,稳定性好)
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,集群和故障转移是构建在开放电信平台框架上。所有主要的编程语言均有与代理接口通讯的客户端库。
目录
AMQP(Advanced Message Queuing Protocol)模型
Publisher Confirms(发布确认模式/发布者确认模式)
RabbitMQ相关概念
Broker
在 RabbitMQ 中,Broker 是 RabbitMQ 服务器本身。RabbitMQ 服务器,负责接收和分发消息。简单来说就是消息队列服务器实体。
Message(消息)
消息是 RabbitMQ 中传递的基本数据单元。
Exchange
消息交换机,它指定消息按什么规则,路由到那个队列。
交换机是消息的中转站,用于接收生产者发送的消息,并根据特定的路由规则将这些消息转发到一个或多个队列中。RabbitMQ提供了多种不同类型的交换机,每种类型的交换机都有不同的消息路由规则。
Queue
消息队列载体,每个消息都会被投入到一个或多个队列。
队列是存储消息的地方,消息会按照先进先出的顺序被消费。每个队列都有一个唯一的名称。消息从交换机路由到队列,然后等待消费者来获取和处理。
Queue是实际保存数据的最小单位。Queue不需要Exchange也可以独立工作,只不过通常在业务场景中,会增加Exchange实现更复杂的消息分配策略。Queue结构天生就具有FIFO的顺序,消息最终都会被分发到不同的Queue当中,然后才被消费者进行消费处理。最为常用的是经典队列Classic。
Binding(绑定关系)
绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
Binding是Exchange和Queue之间的关联规则,定义了消息如何从交换机路由到特定的队列。
Routing Key(路由键)
路由关键字,exchange根据这个关键字进行消息投递。
路由键是一个字符串,生产者在发送消息时指定该字符串,RabbitMQ 根据这个字符串和交换机的类型将消息路由到适当的队列。
Virtual Host
虚拟主机,即RabbitMQ Server。其内部含有独立的queue,exchange和binding等,拥有独立的权限系统,可以做到Virtual Host范围的用户控制。从RabbitMQ的全局角度,Virtual Host可以作为不同权限隔离的手段(一个典型的例子就是不同的应用可以跑在不同Virtual Host)。
虚拟主机,是RabbitMQ中的逻辑容器,用于隔离不同环境或不同应用程序的信息流。每个虚拟主机都有自己的队列,交换机等设置,可以理解为一个独立的RabbitMQ服务。
Producer
消息生产者,就是投递消息的程序。
生产者负责发送消息到Exchange或者Queue。
Consumer
消息消费者,就是接受消息的程序。
消费者负责从Queue中订阅和处理消息。
Connection
Connection连接,管理和维护与RabbitMQ服务器的TCP连接,生产者、消费者通过这个连接和Broker建立物理网络连接。
Channel
消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
Channel通道,是在Connection内创建的轻量级通信通道,用于进行消息的传输和交互。应用程序通过Channel进行消息的发送和接收。通常一个Connection可建立多个Channel。
交换机(Exchange)类型
交换机用于接收生产者发送的消息,并根据特定的路由规则将这些消息转发到一个或多个队列。RabbitMQ提供了多种不同类型的交换机,主要类型有:
Default Exchange
默认交换机是直接交换机,没有由代理预先声明的名称(空字符串)。它有一个特殊属性,使其对于简单的应用程序非常有用:创建的每个队列都会自动使用与队列名称相同的路由键绑定到它。
这是RabbitMQ默认实现的一种交换机,它不需要手动创建。当消息发布到默认交换机时,路由键会被解释为队列的名称,消息会被路由到与路由键名称相同的队列。默认交换机通常用于点对点通信,但不支持复杂的路由策略。
Direct Exchange
根据精确的路由键将消息发送到队列。
这种交换机根据消息的路由键(Routing Key)将消息发送到与之完全匹配的队列。只有当消息的路由键与队列绑定时指定的路由键完全相同时,消息才会被路由到队列。这是一种简单的路由策略,适用于点对点通信。
Fanout Exchange
将消息广泛传播到所有绑定的队列。
这种交换机将消息广播到与之绑定的所有队列,无论消息的路由键是什么。用于发布订/阅模式,其中一个消息被广播给所有订阅者。
Topic Exchange
根据主题模式路由消息。支持复杂的路由键匹配。
这种交换机根据消息的路由键与队列绑定时指定的路由键模式(通配符)匹配程度,将消息路由到一个或多个队列。路由键可以使用通配符符号*(匹配一个单词)和#(匹配零个或多个单词),允许更灵活的消息路由。用于发布/订阅模式和复杂的消息路由需求。
Headers Exchange
根据消息头中的属性路由消息。
这种交换机根据消息的标头信息(Headers)来决定消息的路由,而不是使用路由键。队列和交换机之间的绑定规则是根据标头键值对来定义的,只有当消息的标头与绑定规则完全匹配时,消息才会被路由到队列。适用于需要复杂消息匹配的场景。
交换机类型与路由键
- Direct Exchange:路由键与队列的绑定键完全匹配时,消息会被路由到该队列。
- Fanout Exchange:路由键被忽略,消息会被广播到所有绑定的队列。
- Topic Exchange:路由键可以包含多个部分,使用点(.)分隔,允许进行模式匹配。例如,路由键 sports.football 可以匹配绑定键 sports.* 或 *.football。
- Headers Exchange:路由键不是主要的路由方式,消息头中的属性用于路由。
AMQP(Advanced Message Queuing Protocol)模型
AMQP-高级消息队列协议
RabbitMQ消息流转模型
RabbitMQ的工作模式(消息模式)
RabbitMQ支持多种消息传递模式,这些模式允许应用程序在不同的场景下进行灵活的消息交流。如下:
Simple模式(简单模式队列,即最简单的收发模式)
最直接的方式,P端发送一个消息到一个指定的Queue,中间不需要任何Exchange规则。C端按Queue方式进行消费。
Work Queues(工作序列,资源的竞争)
Producer将消息发送到Queue,多个Consumer同时消费Queue上的消息。消息会均匀的分配个多个Consumer处理。
这种模式是最常用的模式。
Publish/Subscribe(发布订阅,共享资源)
Producer只负责将消息发送到Exchange交换机上。Exchange将消息转发到所有订阅的Queue,并由对应的Consumer去进行消费。
适合场景: 消息需要被多个消费者同时接收的场景。如: 实时通知或者⼴播消息。
Routing(路由模式)
在发布订阅模式的基础上,增加一个Routing Key(路由键),并根据Routing Key判断Exchange将消息转发到哪些Queue上。指定Exchange如何将不同类别的消息分发到不同的Queue上。
Topics(主题模式/通配符模式,路由模式的一种)
在路由模式的基础上,对Routing Key(路由键)增加了模糊匹配的功能。
Topics和Routing的基本原理相同,即:⽣产者将消息发给交换机,交换机根据Routing Key将消息转发给与Routing Key匹配的队列. 类似于正则表达式的⽅式来定义Routing key的模式.
* 代表一个具体的单词。# 代表0个或多个单词。
适合场景: 需要灵活匹配和过滤消息的场景。
RPC(RPC模式)
在RPC模式的过程中, 没有⽣产者和消费者, ⽐较像RPC远程过程调⽤, ⼤概就是通过两个队列实现了⼀个可回调的过程。适用于需要请求-响应机制的场景。
Publisher Confirms(发布确认模式/发布者确认模式)
发布者确认模式通过给发送者提供确认机制,来保证这个消息发送的过程是成功的。
Publisher Confirms 模式是 RabbitMQ 提供的⼀种确保消息可靠发送到 RabbitMQ 服务器的机制。在这种模式下,⽣产者可以等待 RabbitMQ 服务器的确认,以确保消息已经被服务器接收并处理.
通过 Publisher Confirms 模式,⽣产者可以确保消息被 RabbitMQ 服务器成功接收,从⽽避免消息丢失的问题.
发布确认是 RabbitMQ 对 AMQP协议的扩展,发布者确认模式默认是不开启的。如果需要开启发布者确认模式,需要手动在channel中进行声明。发布者确认模式在通道级别使用以下confirmSelect方法启用:
⽣产者将 Channel 设置为 confirm(确认)模式(通过调⽤ channel.confirmSelect()完成)。
使⽤发布确认机制, 必须要将信道设置成confirm(确认)模式。