当前位置:首页 > 科技  > 软件

RabbitMQ高级之失败重试机制(含源码)

来源: 责编: 时间:2023-11-28 09:36:26 419观看
导读一、失败重试机制 当消费者出现异常后,消息会不断requeue(重新入队)到队列,再重新发送给消费者,然后再次异常,再次requeue,无限循环,导致mq的消息处理飙升,带来不必要的压力。 为此,可利用Spring的retry机制,在消费者出现

一、失败重试机制

    当消费者出现异常后,消息会不断requeue(重新入队)到队列,再重新发送给消费者,然后再次异常,再次requeue,无限循环,导致mq的消息处理飙升,带来不必要的压力。uiA28资讯网——每日最新资讯28at.com

    为此,可利用Spring的retry机制,在消费者出现异常时利用本地重试,而不是无限制的requeue到mq队列。uiA28资讯网——每日最新资讯28at.com

配置参数如下:uiA28资讯网——每日最新资讯28at.com

listener: # 开启消费者确认其机制      simple:        prefetch: 1  #消费者每次只能获取一条消息,处理完才能获取下一条(可实现能者多劳)        acknowledge-mode: AUTO  # none:关闭ack;manual:手动ack;auto:自动ack        retry:          enabled: true  #开启消费者失败重试          initial-interval: 1000ms  #初始的失败等待时长为1秒          multiplier: 1 #下次失败的等待时长倍数,下次等待时长 = multiplier * last-interval          max-attempts: 3 #最大重试次数          stateless: true #true无状态;false有状态。如果业务中包含事务,这里改为false

测试结果:uiA28资讯网——每日最新资讯28at.com

图片图片uiA28资讯网——每日最新资讯28at.com

但是重试三次后,队列里面的消息被踢出了:uiA28资讯网——每日最新资讯28at.com

图片图片uiA28资讯网——每日最新资讯28at.com

二、失败消息处理策略

    在开启重试模式后,重试次数耗尽,如果消息依然失败,则需要有MessageRecoverer接口来处理,它包含三种不同的实现:uiA28资讯网——每日最新资讯28at.com

     1、RejectAndDontRequeueRecoverer:重试耗尽后,直接reject,丢弃消息。默认就是这种方式。uiA28资讯网——每日最新资讯28at.com

    2、ImmediateRequeueMessageRecoverer:重试耗尽后,返回nack,消息重新入队(不建议采用:会出现死循环)。uiA28资讯网——每日最新资讯28at.com

     3、RepublishMessageRecoverer:重试耗尽后,将失败消息投递到指定的交换机。(推荐使用)uiA28资讯网——每日最新资讯28at.com

图片图片uiA28资讯网——每日最新资讯28at.com

三、实现方式

3.1、定义接收失败消息的交换机、队列及其绑定关系:uiA28资讯网——每日最新资讯28at.com

/**     * 功能描述:定义接收错误消费的日志     * @MethodName: receiveErrorMessage     * @MethodParam: [message]     * @Return: void     * @Author: yyalin     * @CreateDate: 2023/11/15 9:55     */    @RabbitListener(bindings = @QueueBinding(value = @Queue(name = "errorQueue"),            exchange = @Exchange(name = "errorExchange", type = ExchangeTypes.DIRECT, ignoreDeclarationExceptions = "true"),            key = "errorRouting"    ))    public void receiveErrorMessage(String message) {        log.info("消费者收到发送错误的消息: " + message);    }

3.2、定义RepublishMessageRecoverer:

/** * @Description: TODO:定义错误消息接收 * @Author: yyalin * @CreateDate: 2023/11/15 9:58 * @Version: V1.0 */@Configuration@Slf4jpublic class ErrorConfig {    @Bean    public MessageRecoverer messageRecoverer(RabbitTemplate rabbitTemplate){        log.debug("加载RepublishMessageRecoverer");        return new RepublishMessageRecoverer(rabbitTemplate,"errorExchange","errorRouting");    }}

uiA28资讯网——每日最新资讯28at.com

3.3、测试结果:

图片图片uiA28资讯网——每日最新资讯28at.com

3.4、总结

消费者如何保证消息一定被消费?uiA28资讯网——每日最新资讯28at.com

  •     开启消费者确认机制为auto,由spring确认消息处理成功后返回ack,异常时返回nack。如果一直处理异常会一直重试。
  •     开启消费者失败重试机制,并设置MessageRecoverer,多次重试失败后将消息投递到异常交换机,交由人工处理。

本文链接:http://www.28at.com/showinfo-26-34653-0.htmlRabbitMQ高级之失败重试机制(含源码)

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 双向绑定与单向数据流之争,Solid会取代React吗

下一篇: 新一代WebFlux框架核心技术Reactor响应式编程基本用法

标签:
  • 热门焦点
  • 中兴AX5400Pro+上手体验:再升级 双2.5G网口+USB 3.0这次全都有

    2021年11月的时候,中兴先后发布了两款路由器产品,中兴AX5400和中兴AX5400 Pro,从产品命名上就不难看出这是隶属于同一系列的,但在外观设计上这两款产品可以说是完全没一点关系
  • 三言两语说透设计模式的艺术-简单工厂模式

    一、写在前面工厂模式是最常见的一种创建型设计模式,通常说的工厂模式指的是工厂方法模式,是使用频率最高的工厂模式。简单工厂模式又称为静态工厂方法模式,不属于GoF 23种设计
  • 一年经验在二线城市面试后端的经验分享

    忠告这篇文章只适合2年内工作经验、甚至没有工作经验的朋友阅读。如果你是2年以上工作经验,请果断划走,对你没啥帮助~主人公这篇文章内容来自 「升职加薪」星球星友 的投稿,坐
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 为什么你不应该使用Div作为可点击元素

    按钮是为任何网络应用程序提供交互性的最常见方式。但我们经常倾向于使用其他HTML元素,如 div span 等作为 clickable 元素。但通过这样做,我们错过了许多内置浏览器的功能。
  • 三星Galaxy Z Fold/Flip 5国行售价曝光 :最低7499元/12999元起

    据官方此前宣布,三星将于7月26日也就是明天在韩国首尔举办Unpacked活动,届时将带来带来包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • Windows 11发布,微软一改往常对老机型开放的态度

    距离 Windows 11 发布已经过去一周,在过去一周里,很多数码爱好者围绕其对 Android 应用的支持、对老机型的升级问题展开了激烈讨论。与以往不同的是,在这次大
  • 北京:科技教育体验基地开始登记

      北京“科技馆之城”科技教育体验基地登记和认证工作日前启动。首批北京科技教育体验基地拟于2023年全国科普日期间挂牌,后续还将开展常态化登记。  北京科技教育体验基
Top