RabbitMQ 是否可以在不存在任何队列的情况下保留直接交换消息?

Is it possible with RabbitMQ to preserve direct exchange message without any queues present?

不知是否会出现以下情况:

似乎如果不存在队列,消息就会被丢弃并且无法接收它。

所以基本上我希望能够在没有消费者在场时生成消息。过一段时间再吃。

实体队列是应该保存消息的队列,因此如果没有队列,消息将会丢失。

但是,如果您没有使用适当的路由密钥创建任何交换,您可以利用 rabbitmq 中的死信功能。

It seems like if there is no queue present, the message is dropped and there is no way to receive it.

是的,这是正确的,但这只是故事的一部分。

一条消息队列是发布到服务器的消息的存储位置。 consumer 是指定的连接集,用于接收放入队列的消息。 exchange 只是一个推送消息的位置。它包含路由语义以确定哪些消息在服务器的队列中结束。当一条消息不能路由到一个队列and/or消费者时,有various semantics that can apply,但默认是丢弃消息

处理不可路由消息的选项:

  • Alternate exchange - 指定一个不同的交换器,如果消息无法路由到当前交换器上的队列,则可以在其中转储消息。这可以被认为类似于当目标主机在当前子网上无法访问时 TCP/IP 的工作方式,并且流量被转发到网关。 请注意,必须将队列绑定到备用交换器,以便将消息转储到其中。典型情况可能是将其配置为扇出交换器,并使用一个队列捕获所有发送到其中的消息备用交换。
  • Mandatory or Immediate - return 如果无法送达,将向发件人退回一条消息。服务器不存储消息。
    • Mandatory 指定消息 必须 在发布时可传递到队列。如果消息不可路由,发布者将收到 basic.return.
    • Immediate 指定,除了可交付之外,必须 立即路由到特定队列上的消费者(例如,它不是足够好,可以将其放入队列中以供稍后取货 - 它必须立即 .
    • 交付给最终消费者

在任何情况下,如果没有队列,服务器将无法存储消息。

另一种解决方案是在交换之后和发布消息之前使用绑定声明队列;这样消息将被路由和存储,但您可能必须添加一些 TTL(https://www.rabbitmq.com/ttl.html)。