本节内容主要详细介绍RabbitMQ中几个重要的概念以及术语。
RabbitMQ 简单介绍
RabbitMQ是流行的开源消息队列系统,用Erlang语言开发。RabbitMQ是AMQP(高级消息队列协议)的标准实现。这里我们介绍RabbitMQ中主要涉及的几个重要概念,理解后希望在实际使用中会加深理解。
消息队列服务器
可以为 客户端程序提供消息队列、路由选择和 目录服务。消息队列服务器可以用于:
- 为独立客户提供消息 路由选择和会话集中。
- 在通过 路由链接的站点之间提供消息路由选择。
- 创建队列并存储用于从属客户的消息。
RabbitMQ 消息模型
RabbitMQ消息发送时,生产者是不知道消息是否发送到某个队列中去了,生产者仅仅只能将消息发送给某个交换器。
Broker
RabbbitMQ消息队列代理服务器实体。
Producer
发送消息的应用程序。
Consumer
接收消息的用户程序。
Exchange
交换器,生产者直接将消息发送给交换器。交换器将消息分发给指定的队列。它指定消息按什么规则,路由到哪个队列。
Binding
绑定,指的是交换器和队列之间的关系。它的作用就是把exchange和queue按照路由规则绑定起来。
Routing Key
路由关键字,exchange根据这个关键字进行消息投递。
vhost
虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
Channel
消息通道,包含了大量的API可用于编程。在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
Connection
在客户创建一个到某个虚拟主机的连接。
ConnectionFactory
连接工厂类。可以创建一个连接。
使用注意事项
消息队列的使用过程大概如下:
- 客户端连接到消息队列服务器,打开一个channel。
- 客户端声明一个exchange,并设置相关属性。
- 客户端声明一个queue,并设置相关属性。
- 客户端使用routing key,在exchange和queue之间建立好绑定关系。
- 客户端投递消息到exchange。exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。
exchange也有几个类型,完全根据key进行投递的叫做Direct交换机,例如,绑定时设置了routing key为”abc”,那么客户端提交的消息,只有设置了key为”abc”的才会投递到队列。对key进行模式匹配后进行投递的叫做Topic交换机,符号”#”匹配一个或多个词,符号”*”匹配正好一个词。例如”abc.#”匹配|abc.def.ghi”,”abc.*”只匹配”abc.def”。 还有一种不需要key的,叫做Fanout交换机,它采取广播模式,一个消息进来时,投递到与该交换机绑定的所有队列。
RabbitMQ支持消息的持久化,也就是数据写在磁盘上,为了数据安全考虑,我想大多数用户都会选择持久化。消息队列持久化包括3个部分:
- exchange持久化,在声明时指定durable 为 1
- queue持久化,在声明时指定durable 为 1
- 消息持久化,在投递时指定delivery_mode 为 2(1是非持久化)
如果exchange和queue都是持久化的,那么它们之间的binding也是持久化的。如果exchange和queue两者之间有一个持久化,一个非持久化,就不允许建立绑定。