当消费者队列尚不存在时,如果发布到具有特定路由键的交换器,RabbitMQ 消息是否会丢失?

问题描述 投票:0回答:2

我向RabbitMQ发布消息时,消息是不是以特定的routing key发送到exchange,当consumer queue还不存在时,消息会不会丢失?

go rabbitmq
2个回答
0
投票

是的,RabbitMQ 会丢弃消息。

但是,您关心您的数据,所以您正在使用 出版商确认,对吗?如果是这样,RabbitMQ 将发回一条消息,表明您的消息未被路由。

您还可以指定一个 alternate exchange 来捕获这些消息。


注意: RabbitMQ 团队监控

rabbitmq-users
邮件列表,有时只在 StackOverflow 上回答问题。


-1
投票

几乎每个 MQ 系统的默认配置都是 pub/sub

发布者发送关于某个主题的消息。该消息将转发给所有当前active 订阅该主题的订阅者。

B --> subscribe to MQ topic

A ---pub@topic---> B_any

在此设置中,消息不会重新发送给不活跃的订阅者。 Aka 消息可能会在 pub/sub 中丢失。

2)

另一种方法是称为请求-回复模式的客户端改进。发布者将消息与一个临时的“backward-reply-topic”结合起来,任何收到消息的订阅者都会发送一条消息已收到的回复。通常图书馆不关心有多少订阅者收到了消息,但至少有一个回复了。该技术称为 request-reply。 (如果图书馆指示无回复错误,您显然需要重新发送消息。)

B --> subscribe to MQ topic

A ---req@topic---> B_any
A <-----reply----- B_any

在您的情况下,如果接收端是唯一与主题匹配的端,那将有所帮助。有了这个发件人可以检查消息是否已收到.

3)

如果您想保证消息被传递给未知数量的接收者,即使他们稍后离线,这不会开箱即用.

无论如何,要实现这一点,您需要在 MQ 系统中打开持久性功能。 持久化特性使用流式传输和/或命名持久消费者模式。使用持久性功能,您可以获得更多保证,并从发件人那里删除检查和失败时重新发送功能。 MQ 系统应该存储消息并处理它被正确接收和使用的情况。看看这里的“特征矩阵”:https://www.rabbitmq.com/streams.html

A ---req@topic---> MQ Stream storage 
A <-----reply----- MQ Stream storage 
and
(async)  MQ Stream storage ---req@topic---> B
(async)  MQ Stream storage <-----reply----- B

对于 RabbitMQ 与流的持久性和消费者通读thisthis

很多现代 MQ 系统的行为都是一样的。

© www.soinside.com 2019 - 2024. All rights reserved.