RabbitMQ 是否可以在不存在任何队列的情况下保留直接交换消息?
Is it possible with RabbitMQ to preserve direct exchange message without any queues present?
不知是否会出现以下情况:
- 创建
direct
类型的交易所
- 使用路由键
rk1
向该交换器发布消息
- 之后:
- 创建一个接受带有路由键的消息的队列
rk1
- 消费发布到交易所的消息
似乎如果不存在队列,消息就会被丢弃并且无法接收它。
所以基本上我希望能够在没有消费者在场时生成消息。过一段时间再吃。
实体队列是应该保存消息的队列,因此如果没有队列,消息将会丢失。
但是,如果您没有使用适当的路由密钥创建任何交换,您可以利用 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)。
不知是否会出现以下情况:
- 创建
direct
类型的交易所
- 使用路由键
rk1
向该交换器发布消息
- 之后:
- 创建一个接受带有路由键的消息的队列
rk1
- 消费发布到交易所的消息
- 创建一个接受带有路由键的消息的队列
似乎如果不存在队列,消息就会被丢弃并且无法接收它。
所以基本上我希望能够在没有消费者在场时生成消息。过一段时间再吃。
实体队列是应该保存消息的队列,因此如果没有队列,消息将会丢失。
但是,如果您没有使用适当的路由密钥创建任何交换,您可以利用 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 指定,除了可交付之外,必须 立即路由到特定队列上的消费者(例如,它不是足够好,可以将其放入队列中以供稍后取货 - 它必须立即 . 交付给最终消费者
- Mandatory 指定消息 必须 在发布时可传递到队列。如果消息不可路由,发布者将收到
在任何情况下,如果没有队列,服务器将无法存储消息。
另一种解决方案是在交换之后和发布消息之前使用绑定声明队列;这样消息将被路由和存储,但您可能必须添加一些 TTL(https://www.rabbitmq.com/ttl.html)。