面试题答案
一键面试重试策略
- 定时重试:RocketMQ消费者消费消息失败后,默认会按照一定时间间隔进行重试。比如第一次失败后,间隔较短时间(如10秒)重试,随着重试次数增加,间隔时间可能会逐步变长(如20秒、40秒等)。这样的设计可以避免短时间内频繁重试对系统资源的过度消耗,同时给系统一定时间处理失败原因(如网络波动等临时问题)。
- 基于错误类型的重试:对于不同类型的错误,可以有不同的重试策略。例如,对于可恢复的网络异常错误,通常会积极重试;而对于业务逻辑导致的不可恢复错误(如数据格式永久性错误等),可以减少重试次数或者不重试。
重试次数的控制
- 默认次数:RocketMQ有默认的最大重试次数,不同的消费模式下有所不同。在集群消费模式下,默认重试16次。
- 自定义配置:开发者可以根据业务需求自定义重试次数。通过设置Consumer的相关参数,可以调整最大重试次数。例如,如果业务允许,对于一些重要但偶尔因特殊情况失败的消息,可以适当增加重试次数;而对于一些不太关键且可能存在系统性问题导致失败的消息,可以减少重试次数。
避免消息一直重试导致死循环问题
- 设置最大重试次数:如上述提到的,通过设置合适的最大重试次数,当达到该次数后,消息不再重试。此时可以将该消息发送到死信队列(DLQ,Dead Letter Queue),以便后续分析处理。
- 业务逻辑判断:在消费逻辑中,加入对失败原因的判断。如果发现是永久性错误(如数据不满足业务规则且无法修正等),直接返回消费失败且不再进行重试,避免无意义的重试。例如,订单金额为负数这种不符合业务逻辑的情况,不再重试,直接处理到死信队列。
- 监控与人工干预:建立对重试消息的监控机制,实时了解重试消息的数量、重试频率、重试失败原因等信息。一旦发现有消息频繁重试且可能存在死循环风险,及时进行人工干预,分析原因并调整业务逻辑或配置。