[转帖]RabbitMQ 的重要概念(术语)

rabbitmq,重要,概念,术语 · 浏览次数 : 0

小编点评

**Message 消息** Message 消息是 RabbitMQ 中用于存储数据的队列中保存的数据。 **生产者 (message publisher)** * 创建和发送消息的程序。 * 指定 vhost,用于隔离不同用户的队列。 **消费者 (message receiver)** * 从队列中获取消息并进行处理。 * 建立绑定关系以绑定队列到交换机。 **Binding 绑定** * 将指定的队列绑定到交换机。 * 使用 `routing_key` 指定消息的路由规则。 **routing_key 和 binding_key** * `routing_key` 是用于路由消息的关键字。 * `binding_key` 是用于绑定队列的关键字。 * `binding_key` 在 `basic_publish()` 和 `queue_bind()` 方法中使用。 ** queue_bind() 方法** * 用于绑定队列。 * 使用 `binding_key` 和 `routing_key` 来指定绑定关系。 * 支持 `autoAck` 参数,用于开启手动回执。

正文

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。

  1. # 使用 binding_key 建立绑定关系
  2. $binding_key = 'black';
  3. $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>

与[转帖]RabbitMQ 的重要概念(术语)相似的内容:

[转帖]RabbitMQ 的重要概念(术语)

Message 消息指的是 RabbitMQ 的队列中保存的数据。 Producer 消息的生产者,即 message publisher(sender),是指负责创建和发送消息的程序。 Vhost RabbitMQ 的虚拟主机,一个 broker 里可以开设多个 vhost,用作不同用户的权限分离

[转帖]RabbitMQ服务优化,修改最大连接数

https://www.cnblogs.com/hoyeong/p/16242202.html RabbitMQ的优化RabbitMQ的连接数是压垮消息队列的一个重要的指标。所以在平时使用OpenStack平台的过程中,如果大量的用户同时创建虚拟机,会导致云平台创建报错,其实就是消息队列服务的崩溃。

[转帖]RabbitMQ 消费者回执和发布确认

为了保证数据安全,消费者和生产者的回执(ack)都是非常重要的。 由于我们无法保证消息都能像我们期望的那样,正常到达另一端或者被 Consumer 消费成功。因此,publisher 和 consumer 都需要一种机制,来确保消息投递成功了和消息消费成功了。 在 AMQP 0-9-1 中,消费者处

[转帖]RabbitMQ的Vhost,Exchange,Queue原理分析

RabbitMQ的Vhost,Exchange,Queue原理分析https://www.cnblogs.com/zhengchunyuan/p/9253725.html Vhost分析 RabbitMQ的Vhost主要是用来划分不同业务模块。不同业务模块之间没有信息交互。 Vhost之间相互完全隔

[转帖]RabbitMQ性能优化

https://www.cnblogs.com/zhengchunyuan/p/9253728.html 修改rabbitmq.config文件 rabbitmq.config文件时rabbitmq的配置文件,他遵守Erlang配置文件定义。 rabbitmq.config文件位置: Unix $R

[转帖]RabbitMQ:Exchange的Fanout类型的介绍和使用

https://blog.csdn.net/weixin_45492007/article/details/106095591 1.声明 当前的内容用于本人学习和使用Fanout类型的Exchange,主要理解其主要作用 2.Fanout Exchange的官方介绍 扇出交换机将消息路由到与其绑定的

[转帖]RabbitMQ erlang.cookie解惑

https://www.cnblogs.com/xgtx/articles/6068392.html 在搭建RabbitMQ集群的时候往往会因为.erlang.cookie而报各种错误,网上查资料也会经常说.erlang.cookie会在$home下,或者在/var/lib/rabbitmq下,到底

[转帖]如何选择RabbitMQ的消息保存方式?

https://www.cnblogs.com/zhengchunyuan/p/10179677.html RabbitMQ对于queue中的message的保存方式有两种方式:disc和ram。如果采用disc,则需要对exchange/queue/delivery mode都要设置成durabl

[转帖]RabbitMQ 如何保证交换机中的消息不丢失

我们知道,生产者会先将消息发送给交换机,但是如果交换机此时没有匹配到相关的队列时,交换机中的消息就会出现丢失的问题。 那么,如何保证交换机中的消息不丢失呢? mandatory 参数 当 basicPublish 方法的 mandatory 参数设为 true 时,如果交换器无法匹配到绑定的队列,那

[转帖]RabbitMQ学习笔记05:Routing

参考资料:RabbitMQ tutorial - Routing — RabbitMQ 前言 在之前的文章中我们构建了一个简单的日志系统,它可以广播消息到多个消费者中。 在这篇文章中,我们打算实现仅订阅消息的子集(即不是所有的消息,仅仅只是一部分消息。注意,这里不是说一条消息的一部分)。例如我们只会