- Broker:可以理解为消息队列服务器的实体,它是一个中间件应用,负责接收 消息生产者 的消息,然后将消息发送至 消息接收者 或其他的Broker.
- Exchange:消息交换机, 是消息第一个到达的地方,消息通过它指定的路由规则,分发到不同的消息队列中去。
- Queue:消息队列,消息通过发送和路由之后最终到达的地方,到达Queue的消息即进入逻辑上等待消费的状态。每个消息都会被发送到一个或多个队列。
- Binding:绑定,它的作用就是把Exchange和Queue按照路由规则绑定起来,也就是Exchange和Queue之间的虚拟连接。
- Routing Key:路由关键字,Exchange根据这个关键字进行消息投递。
- Virtual host:虚拟主机,它是对Broker的虚拟划分,将消费者、生产者和它们依赖的AMQP相关结构进行隔离,一般都是为了安全考虑。比如,我们可以在一个Broker中设置多个虚拟主机,对不同用户进行权限的分离。
- Connection:连接,代表生产者、消费者、Broker之间进行通信的物理网络。
- Channel: 消息通道,用于连接生产者和消费者的逻辑结构。在客户端的每个连接里,可建立多个Channel,每个Channel代表一个会话任务,通过Channel可以隔离同一连接中的不同交互内容。
- Producer:消息生产者,制造消息并发送消息的程序。
- Consumer: 消息消费者,接收消息并处理消息的程序。
消息投递到队列的整个过程大致如下:
- 客户端连接到消息队列服务器,打开了一个Channel。
- 客户端声明了一个Exchange,并设置了相关属性。
- 客户端声明了一个Queue,并设置了相关属性。
- 客户端使用Routing Key,在Exchange和Queue之间建立好绑定关系。
- 客户端投递消息到Exchange。
- Exchange接收到消息后,根据消息的Key和已经设置的Binding,进行消息路由,将消息投递到一个或多个Queue里。
Exchange也有几种类型
- Direct交换机:完全根据Key进行投递。
- Topic交换机: 对Key进行模式匹配后进行投递,可以使用符合#匹配一个或多个词,符号*匹配正好一个词。
- Fanout交换机:不需要任何Key,它采取广播的模式,一个消息进来时,投递到与该交换机绑定的所有队列。
RabbitMQ支持消息的持久化,也就是将数据写在磁盘上。为了数据安全考虑,大多数情况下都会选择持久化。消息队列持久化包括3个部分:
- Exchange持久化:在声明时指定durable => 1
- Queue持久化:在声明时指定durable => 1
- 消息持久化,在投递时指定delivery_mode => 2 (1是非持久化)。
如果Exchange和Queue都是持久化的,那么它们之间的Binding也是持久化的。如果Exchange和Queue两者之间一个是持久化的,一个是非持久化的,就不允许建立绑定。