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

时间:2019-10-04 17:55:15

标签: rabbitmq amqp

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

  • 创建类型为direct的交易所
  • 使用路由键rk1
  • 将消息发布到该交换机
  • 之后:
    • 创建一个队列,该队列接受带有路由键rk1的邮件
    • 使用已发布的消息进行交换

似乎没有队列,消息将被丢弃并且无法接收。

所以基本上,我希望在没有使用者的情况下能够产生消息。稍后再食用。

3 个答案:

答案 0 :(得分:2)

  

似乎没有队列,消息将被丢弃并且无法接收。

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

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

处理无法路由的消息的选项:

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

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

答案 1 :(得分:0)

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

但是,如果您没有使用适当的路由密钥创建任何交换,则可以利用Rabbitmq中的无效字体功能。

答案 2 :(得分:0)

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