向指定路由键的RabbitMQ交换机发消息时,若消费者队列未存在会丢消息吗?
当向RabbitMQ指定路由键的交换机发消息,对应消费者队列未创建时,消息是否会丢失?
默认情况下消息会丢失,但能否避免丢失完全取决于你做的配置:
无兜底配置时必然丢失
不管是直连(direct)、主题(topic)、扇形(fanout)还是头部(headers)交换机,只要当前没有队列与该交换机通过匹配的路由键(扇形交换机无需路由键)绑定,消息就没有投递目标,RabbitMQ会直接丢弃它。哪怕开启了消息持久化(delivery_mode=2)也没用——持久化仅针对已投递到队列的消息,无匹配队列的消息根本没机会被持久化。用
mandatory参数回收消息
发布消息时设置mandatory=true,如果消息找不到匹配队列,RabbitMQ会通过Basic.Return命令将消息返回给生产者。生产者可以在收到返回消息后自行处理,比如存入数据库等待队列创建后重发,或记录日志留底。配置备份交换器(Alternate Exchange)兜底接收
给目标交换机配置备份交换器后,当消息无法匹配任何队列时,会自动路由到备份交换器绑定的队列中。这种方式无需修改生产者逻辑,靠RabbitMQ自身路由规则就能保住消息,适合做全局消息兜底。注意:事后创建队列无法找回历史消息
哪怕后续创建了对应的队列,之前已被丢弃的消息也无法恢复——RabbitMQ不会为无匹配的消息做临时存储,必须提前配置好兜底规则才能避免丢失。
内容的提问来源于stack exchange,提问作者dwlpra
相关产品推荐
相关产品推荐

