【发布时间】:2020-02-03 01:46:35
【问题描述】:
我想知道以下情况是否可能:
- 创建
direct类型的交换 - 使用路由密钥
rk1向该交换机发布消息 - 之后:
- 创建一个接受带有路由键
rk1的消息的队列 - 使用发布到交换的消息
- 创建一个接受带有路由键
似乎如果没有队列存在,则消息被丢弃并且无法接收。
所以基本上我希望能够在没有消费者在场的情况下产生消息。并在一段时间后消耗它们。
【问题讨论】:
我想知道以下情况是否可能:
direct 类型的交换
rk1 向该交换机发布消息
rk1的消息的队列
似乎如果没有队列存在,则消息被丢弃并且无法接收。
所以基本上我希望能够在没有消费者在场的情况下产生消息。并在一段时间后消耗它们。
【问题讨论】:
实体队列是应该保存消息的队列,因此如果没有队列,消息将丢失。
但是,如果您没有使用适当的路由密钥创建任何交换,您可以利用 rabbitmq 中的死信功能。
【讨论】:
似乎如果没有队列存在,则消息被丢弃并且无法接收。
是的,这是正确的,但这只是故事的一部分。
消息队列是发布到服务器的消息的存储位置。 consumer 是一个指定的连接集,用于接收放入队列的消息。 exchange 只是一个推送消息的位置。它包含路由语义以确定哪些消息在服务器上的队列中结束。当消息无法路由到队列和/或消费者时,有various semantics that can apply,但默认是丢弃消息。
处理不可路由消息的选项:
basic.return。在任何情况下,如果没有队列,服务器就无法存储消息。
【讨论】:
另一种解决方案是在交换之后和发布消息之前声明具有绑定的队列;这样消息将被路由和存储,但您可能需要添加一些 TTL (https://www.rabbitmq.com/ttl.html)。
【讨论】: