Message
消息指的是 RabbitMQ 的队列中保存的数据。
Producer
消息的生产者,即 message publisher(sender),是指负责创建和发送消息的程序。
Vhost
RabbitMQ 的虚拟主机,一个 broker 里可以开设多个 vhost,用作不同用户的权限分离和隔离不同系统的队列。
vhost 拥有自己的权限机制,这使得你能够安全地使用一个 RabbitMQ 服务器来服务众多的应用程序。
vhost 和 RabbitMQ 的关系就如同虚拟机与物理服务器一样。它既能将同一个 RabbitMQ 的多个用户区分管理,又可以避免多系统的交换机、队列的命名冲突。
默认的 vhost 是 /,如果你不需要多个 vhost,就使用默认的。你可以在连接 RabbitMQ 时指定 vhost。
Exchange
交换机负责把来自生产者的消息,按照一定的路由规则,发送给与其建立了绑定关系的队列。
交换机的 type(类型) 主要包含以下四种:
- direct: 它会把消息路由给 binding_key 与 routing_key 完全匹配的队列。
- topic: 与 direct 交换机类似,也是将消息路由给 binding_key 与 routing_key 相匹配的队列。 只不过,topic 交换机不是完全匹配,它的匹配规则更加灵活,支持模糊匹配。
- headers: 它会把消息路由给 binding_key(键值对)与消息的 headers 中的键值对完全匹配的队列。
- fanout: 顾名思义,它会把收到的所有消息广播给所有与它绑定的队列。
Queue
队列是存储消息的缓存区,消息可以被投递到指定的一个或多个队列中存储起来。
队列在 RabbitMQ 服务器内部,消息都存储在队列中,队列中能够存储的消息的数目只受限于服务器的内存大小和磁盘限额。
RabbitMQ 服务器可以包含多个 Queue,每个 Queue 都有自己的名称(queue_name)。
Consumer
消息的消费者,即 message receiver,就是从队列中获取(接收)消息并进行消息处理的程序。
Binding
绑定是指将指定的队列绑定到交换机,从而建立队列和交换机之间的绑定关系。
routing_key
routing_key 是 basic_publish() 方法的第三个参数。
当生产者发送消息给交换机时,一般会指定 routing_key,来指定该消息的路由规则。
routing_key 需要配合交换机的 type 和 binding_key 一起使用才会生效。
binding_key
queue_bind() 方法的第三个参数是 routing_key,为了避免与 basic_publish() 方法的第三个参数 routing_key 搞混淆了。
我们将 queue_bind() 方法的第三个参数称之为 binding_key。
- # 使用 binding_key 建立绑定关系
- $binding_key = 'black';
- $channel->queue_bind($queue_name, $exchange_name, $binding_key);
binding_key 的意义依赖于交换机的类型。fanout 类型的交换机,会直接忽略 binding_key 的值。
Broker
RabbitMQ 服务器实例,就是消息队列服务器的实例(节点)。
说明: Producer、Broker、Consumer 并不是一定要在同一台主机上,对于大多数的应用,它们会属于不同的主机。
Message acknowledgment
消息回执(消息确认)是指消费者在消费完消息后手动发送一个回执(ack)给 RabbitMQ,RabbitMQ 收到 ack 回执后,才会把消息从内存中删除(实质上是先打上删除标记,之后再删除)。
将 autoAck 参数设置为 false,即表示开启手动回执功能。 这时,RabbitMQ 队列中的消息分为了两个部分:
- 一部分是等待发送给消费者的消息(Ready);
- 另一部分是已经发送给消费者但还未收到消费者的 ack 信号的消息(Unacked)。
如果 RabbitMQ 一直没有收到消费者的 ack 信号,并且该消费者已断开了连接,那么,RabbitMQ 会安排该消息重新进入队列,等待投递给下一个消费者,当然也有可能还是原来的消费者。这样做的目的是,既保证了消息不会轻易丢失,又让消费者有足够的时间去处理消息。当然,这样会降低系统的吞吐量。
</article>