出版商
“出版商”一词在不同的上下文中有不同的含义。一般来说,在消息传递中 发布者(也称为“生成者”)是应用程序(或应用程序实例) 发布 (生成) 消息。同一应用程序也可以使用消息 因此同时也是消费者。
消息传递协议还具有消息传递的持久订阅的概念。 订阅是通常用于描述此类实体的一个术语。消费者是另一个问题。 RabbitMQ 支持的消息收发协议同时使用这两个术语,但 RabbitMQ 文档倾向于后者。
RabbitMQ 是一个消息传递代理。它接受来自发布者的消息,并路由它们 并且,如果有要路由到的队列,则存储它们以供使用或立即使用 向消费者交付(如果有)。
发布者发布到的目标因协议而异。在 AMQP 0-9-1 中, 发布商向 Exchange 发布内容。在 AMQP 1.0 中,发布发生在链接上。 在 MQTT 中,发布者发布到主题。最后,STOMP 支持 各种目标类型:主题、队列、AMQP 0-9-1 交换。这包括 有关更多详细信息,请参阅 协议特定的差异 部分。
发布消息必须路由到队列(主题等)。队列 (topic) 可能具有在线使用者。当消息成功路由到队列并且存在 如果在线消费者可以接受更多投放,则消息将为 发送给消费者。
尝试发布到不存在的队列(主题)将导致频道级 exception 替换为 和 render 尝试的通道 on 以关闭。
消费者
“消费者”一词在不同的上下文中有不同的含义。通常,在消息传递的上下文中 而流式处理,Consumer 是使用和确认消息的应用程序(或应用程序实例)。同一应用程序还可以发布消息,从而同时成为发布者。
消息传递协议还具有消息传递的持久订阅的概念。 订阅是通常用于描述此类实体的一个术语。消费者是另一个问题。 RabbitMQ 支持的消息收发协议同时使用这两个术语,但 RabbitMQ 文档倾向于 更喜欢后者。
从这个意义上说,使用者是消息传递的订阅,它必须 在投放开始之前注册,应用程序可以取消。
RabbitMQ 是一个消息传递代理。它接受来自发布者的消息,并路由它们 并且,如果有要路由到的队列,则存储它们以供使用或立即使用 向消费者交付(如果有)。
使用者从队列中使用。为了使用消息,必须有一个队列。 添加新的使用者时,假设队列中已经有消息准备就绪, 交货将立即开始。
在使用者注册时,目标队列可以为空。在那种情况下 当新邮件排队时,将进行首次投放。
尝试从不存在的队列中使用将导致通道级别的 exception 替换为 和 render 尝试的通道 on 以关闭。
队列
RabbitMQ 中的队列是消息的有序集合。消息以 (FIFO) (“先进先出”) 方式入队和出队 (交付给使用者)。
用通用术语定义队列,它是一个顺序数据结构,有两个主要操作:项目可以在尾部排队(添加)和从头部出队(消费)。
队列在消息传递技术领域发挥着重要作用。许多消息收发协议和工具都假定发布者和使用者使用类似队列的存储机制进行通信。
消息收发系统中的许多功能都与队列相关。某些 RabbitMQ 队列功能(例如使用者的优先级和重新排队)可能会影响使用者观察到的排序。
Streams 是 RabbitMQ 中提供的另一种消息收发数据结构。Streams 提供与队列不同的功能。
队列属性
队列具有定义其行为方式的属性。有一套 的强制属性和可选属性的映射:
- 名字
- 持久(队列将在代理重启后继续存在)
- 独占(仅由一个连接使用,当该连接关闭时,队列将被删除)
- 自动删除(当最后一个使用者取消订阅时,将删除至少有一个使用者的队列)
- 参数(可选;由插件和代理特定的功能(如消息 TTL、队列长度限制等)使用)
请注意,并非所有属性组合在实践中都有意义。例如,自动删除 独占队列应以服务器命名。这样的队列应该是 用于特定于客户端或特定于连接(会话)的数据。当自动删除或独占队列使用已知(静态)名称时,在客户端断开连接的情况下 并立即重新连接,则 RabbitMQ 节点之间将存在自然的争用条件 这将删除此类队列,并恢复尝试重新声明它们的客户端。 这可能会导致客户端连接恢复失败或异常,并造成不必要的混淆 或影响应用程序可用性。