RabbitMQ的题

一、如何保证RabbitMQ消息的可靠传输?

从这个图中, 可以看出, 消息可能丢失的场景以及解决⽅案:
1. ⽣产者将消息发送到 RabbitMQ失败
    a. 可能原因: ⽹络问题等
    b. 解决办法: 发送⽅确认-confirm确认模式
2. 消息在交换机中⽆法路由到指定队列:
    a. 可能原因: 代码或者配置层⾯错误, 导致消息路由失败
    b. 解决办法: 发送⽅确认-return模式
3. 消息队列⾃⾝数据丢失
    a. 可能原因: 消息到达RabbitMQ之后, RabbitMQ Server 宕机导致消息丢失.
    b. 解决办法: 持久性  开启 RabbitMQ持久化, 就是消息写⼊之后会持久化到磁盘, 如果RabbitMQ 挂了, 恢复之后会⾃动读取之前存储的数据. (极端情况下, RabbitMQ还未持久化就挂了, 可能导致少量数据丢失, 这个概率极低, 也可以通过集群的⽅式提⾼可靠性)
4. 消费者异常, 导致消息丢失
   a. 可能原因: 消息到达消费者, 还没来得及消费, 消费者宕机. 消费者逻辑有问题.
   b. 解决办法: 消息确认   RabbitMQ 提供了 消费者应答机制 来使 RabbitMQ 能够感知到消费者是否消费成功消息. 默认情况下消费者应答机制是⾃动应答的, 可以开启⼿动确认, 当消费者确认消费成功后才会删除消息, 从⽽避免消息丢失. 除此之外, 也可以配置重试机, 当消息消费异常时, 通过消息重试确保消息的可靠性

二. 死信队列的概念
死信(Dead Letter)是消息队列中的⼀种特殊消息, 它指的是那些⽆法被正常消费或处理的消息.在消息队列系统中, 如RabbitMQ, 死信队列⽤于存储这些死信消息

三. 死信的来源
1) 消息过期: 消息在队列中存活的时间超过了设定的TTL
2) 消息被拒绝: 消费者在处理消息时, 可能因为消息内容错误, 处理逻辑异常等原因拒绝处理该消息. 如果拒绝时指定不重新⼊队(requeue=false), 消息也会成为死信.
3) 队列满了: 当队列达到最⼤⻓度, ⽆法再容纳新的消息时, 新来的消息会被处理为死信.

四. 死信队列的应⽤场景
对于RabbitMQ来说, 死信队列是⼀个⾮常有⽤的特性. 它可以处理异常情况下,消息不能够被消费者正确消费⽽被置⼊死信队列中的情况, 应⽤程序可以通过消费这个死信队列中的内容来分析当时遇到的异常情况, 进⽽可以改善和优化系统.
⽐如: ⽤⼾⽀付订单之后, ⽀付系统会给订单系统返回当前订单的⽀付状态
为了保证⽀付信息不丢失, 需要使⽤到死信队列机制. 当消息消费异常时, 将消息投⼊到死信队列中, 由订单系统的其他消费者来监听这个队列, 并对数据进⾏处理(⽐如发送⼯单等,进⾏⼈⼯确认).
场景的应⽤场景还有:
• 消息重试:将死信消息重新发送到原队列或另⼀个队列进⾏重试处理.
• 消息丢弃:直接丢弃这些⽆法处理的消息,以避免它们占⽤系统资源.
• ⽇志收集:将死信消息作为⽇志收集起来,⽤于后续分析和问题定位.

五、延迟队列是⼀个特殊的队列, 消息发送之后, 并不⽴即给消费者, ⽽是等待特定的时间, 才发送给消费者.
延迟队列的应⽤场景有很多, ⽐如:
1. 订单在⼗分钟内未⽀付⾃动取消
2. ⽤⼾注册成功后, 3天后发调查问卷
3. ⽤⼾发起退款, 24⼩时后商家未处理, 则默认同意, ⾃动退款
4. ......
但RabbitMQ本⾝并没直接实现延迟队列, 通常有两种⽅法:
1. TTL+死信队列组合的⽅式
2. 使⽤官⽅提供的延迟插件实现延迟功能
⼆者对⽐:
1. 基于死信实现的延迟队列
a. 优点: 1) 灵活不需要额外的插件⽀持
b. 缺点: 1) 存在消息顺序问题 2) 需要额外的逻辑来处理死信队列的消息, 增加了系统的复杂性
2. 基于插件实现的延迟队列
a. 优点: 1) 通过插件可以直接创建延迟队列, 简化延迟消息的实现. 2) 避免了DLX的时序问题
b. 缺点: 1) 需要依赖特定的插件, 有运维⼯作 2) 只适⽤特定版本

以下是一些常见的RabbitMQ面试及其答案: 1. RabbitMQ是什么?它的作用是什么? RabbitMQ是一个开源的消息代理,用于在应用程序之间进行消息传递。它实现了高级消息队列协议(AMQP),并支持多种消息传递模式,包括点对点、发布/订阅和工作队列。RabbitMQ的作用是提供一种可靠的机制,使得应用程序可以异步地进行通信,从而提高系统的可伸缩性和可靠性。 2. RabbitMQ的主要组件是什么? RabbitMQ的主要组件包括生产者、消费者、交换机、队列和绑定。生产者将消息发送到交换机,交换机根据其类型将消息路由到一个或多个队列中,消费者从队列中接收消息并进行处理。 3. RabbitMQ支持哪些消息传递模式? RabbitMQ支持点对点、发布/订阅和工作队列三种消息传递模式。点对点模式中,生产者将消息发送到一个队列中,消费者从该队列中接收消息。发布/订阅模式中,生产者将消息发送到一个交换机中,交换机将消息路由到多个队列中,消费者从这些队列中接收消息。工作队列模式中,多个消费者从同一个队列中接收消息,每个消息只能被一个消费者处理。 4. RabbitMQ的消息确认机制是什么? RabbitMQ的消息确认机制包括生产者确认和消费者确认。生产者确认是指生产者在将消息发送到RabbitMQ后,等待RabbitMQ返回确认消息,以确保消息已经成功发送到RabbitMQ。消费者确认是指消费者在处理完一条消息后,向RabbitMQ发送确认消息,以告知RabbitMQ该消息已经被成功处理。 5. RabbitMQ的持久化机制是什么? RabbitMQ的持久化机制包括消息持久化和队列持久化。消息持久化是指将消息保存到磁盘上,以确保即使在RabbitMQ重启后,消息也不会丢失。队列持久化是指将队列的元数据保存到磁盘上,以确保即使在RabbitMQ重启后,队列也不会丢失。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值