【问题标题】:Is it possible with RabbitMQ to preserve direct exchange message without any queues present?RabbitMQ 是否可以在不存在任何队列的情况下保留直接交换消息?
【发布时间】:2020-02-03 01:46:35
【问题描述】:

我想知道以下情况是否可能:

  • 创建direct 类型的交换
  • 使用路由密钥rk1 向该交换机发布消息
  • 之后:
    • 创建一个接受带有路由键rk1的消息的队列
    • 使用发布到交换的消息

似乎如果没有队列存在,则消息被丢弃并且无法接收。

所以基本上我希望能够在没有消费者在场的情况下产生消息。并在一段时间后消耗它们。

【问题讨论】:

    标签: rabbitmq amqp


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      似乎如果没有队列存在,则消息被丢弃并且无法接收。

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

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2012-04-26
          • 2011-02-07
          • 2016-05-21
          • 2023-04-08
          • 2013-06-09
          • 1970-01-01
          • 2017-09-10
          • 1970-01-01
          • 2011-12-29
          相关资源
          最近更新 更多