核心概念
本文主要对消息服务RabbitMQ涉及的专有名词和术语进行定义和解释,方便您更好地理解相关概念并使用该产品。
RabbitMQ
RabbitMQ是一款用Erlang语言实现,完全支持AMQP协议的开源分布式消息队列系统,具备强大的分布式、可扩展和高可用能力。RabbitMQ在TCP协议层面提供了丰富的多语言SDK,便于用户使用。
AMQP(高级消息队列协议)
AMQP(Advanced Message Queue Protocol)是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,不受客户端/中间件不同产品,不同的开发语言等条件的限制。
消息(Message)
消息队列服务对外服务的基本实体单元,消息由Header(标签)和Body(消息体)组成。Header是消息生产者添加的各种属性的集合,包括消息是否被持久化,由哪个队列接受,优先级是多少等等。Body是消息体,是真正需要被传输的数据。
队列(Queue)
消息的容器,存储被生产者投递过来但尚未被消费的消息。生产者把消息发送到队列,消费者从队列中获取并消费消息。每个消息会被投放到一个或多个队列里。
生产者(Producer)
发送消息的应用,消息数据的来源。
消费者(Consumer)
接收消息的应用,消息数据的去处。
Exchange(交换机)
用于决定消息与队列之间投递关系的机制,本质上为消息路由。路由的基础是Routing Key(路由键)和Binding Key(绑定键)。生产者投递消息时,在Header中指定消息的Routing Key。每个队列被指定一个或多个Key(通配符),并将这些Key与Exchange绑定,称为Binding Key。Exchange通过Routing Key与Binding Key的匹配规则来决定消息应该投递给哪个/哪些队列。具体而言,Exchange支持如下几种类型:
- Fanout(扇出):忽略Routing Key(认为匹配所有的Binding Key),将消息传递给Exchange所绑定的所有队列。
- Direct(直接/点对点):精确匹配Routing Key与Binding Key,只将消息投递给能够匹配的队列。
- Topic(主题/分发-订阅):模糊匹配Routing Key与Binding Key,其中“#”通配任意0个或多个单词,“*”通配任意1个单词。
- Headers:该类型的Exchange不依赖于Routing Key与Binding Key的匹配规则来路由消息,而是根据发送的消息内容中的Headers属性进行匹配。
- RPC:MQ本身是基于异步的消息处理,生产者将消息投递到消息代理之后不关心也不会知道消费者后续处理成功或者失败。但在一些应用场景中,很可能需要同步处理机制,生产者需要同步等待服务端将消息处理完成后再进行下一步处理。
Broker Server(代理服务器)
消息代理的服务端程序。Exchange机制、队列都位于其中。从生产者客户端连接中接受消息,存储消息,将消息路由到相应的队列,并将队列中的消息发送给消费者客户端。
Vhost(虚拟主机)
不同的用户通过使用不通的虚拟主机,能够做到权限的隔离。在虚拟主机内,用户可以创建Exchange,Queue等。
Connection(连接)
代理服务器与客户端之间建立的TCP连接,代理服务器保证不会主动关闭连接,除非出现网络错误或者服务出现问题。
Channel(通道)
Connection的逻辑概念,只有通过Channel才能执行AMQP命令。业务程序通过Channel与Broker Server交互,Channel之间互不影响。建议客户端线程之间不公用Channel,或者至少要保证多个线程在一个Channel上发送消息的行为是串行的。
Command(命令)
AMQP的命令。客户端通过Command执行与AMQP服务器的交互。例如在RabbitMQ中,客户端可以通过publish命令发送消息,通过txSelect开启一个事务,通过txCommit提交一个事务。
优先级队列
RabbitMQ支持按照消息优先级的高低来消费消息的队列。生产者在发送消息时,需要设置该消息的优先级,RabbitMQ按照队列中优先级高低的顺序来执行消费。
死信队列
消息在消费失败、TTL过期、队列长度超限之后会被重新发送到一个特殊的Exchange,即dead letter exchange(DLX),进入到DLX的消息不会被重新发送到原来的队列重新消费。
延时队列
采用延时队列插件(rabbitmq-delayed-message-exchange)来实现延时队列功能(延时队列本身依赖18.0及以上版本的Erlang/OTP)。