微服务: 05-rabbitmq设置重试次数并设置死信队列

这篇具有很好参考价值的文章主要介绍了微服务: 05-rabbitmq设置重试次数并设置死信队列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 上文传送门: 

2. 前言简介: 

2.1 问: 消费端重复循环异常如何解决?

2.2 为什么要使用死信队列

2.3 案例思路

-> ps: 以下案例经过测试(思路一/二实现原理一样)

-> 2.3.1 思路一 

-> 2.3.2 思路二

3. 案例代码

3.1 简单介绍案例

3.2 声明交换机 队列 以及绑定路由键

3.3 修改配置文件

3.4 发送消息

 3.5 接收消息(自动确认)

3.6 开启测试代码

3.7 测试结果

---> 3.7.1 查看交换机

 ---> 3.7.2 查看队列​编辑

 ---> 3.7.3 主要查看方向

---> 3.7.4 另外遇到问题 别慌


1. 上文传送门: 

微服务: 00-rabbitmq出现的异常以及解决方案

微服务: 01-rabbitmq的应用场景及安装(docker)

微服务: 02-rabbitmq在springboot中如何使用(上篇)

微服务: 03-rabbitmq在springboot中如何使用(下篇)

微服务: 04-springboot中rabbitmq配置,消息回收,序列化方式

2. 前言简介: 

上面文章是安装, 基础测试案例, 下面是进阶的第一篇文章

本篇主要介绍自动确认进入死信队列
手动确认在下一篇介绍

2.1 问: 消费端重复循环异常如何解决?

使用 RabbitMQ 的重试机制,当消费者处理消息失败时,可以将消息重新放回队列中,并设置一定的重试次数和重试时间间隔。如果超过了重试次数仍然处理失败,则可以将消息放入死信队列中,方便后续处理

2.2 为什么要使用死信队列

无法被消费的消息, 这样的消息如果没有后续的处理,就会一直在正常队列里重复重试, 所以加入私信队列后 进行人工补偿, 也可以分等级 哪些重要消息需要优先处理

2.3 案例思路

-> ps: 以下案例经过测试(思路一/二实现原理一样)

-> 2.3.1 思路一 

 两个交换机(一个正常exchange 一个死信exchange)

 两个队列(正常queue,死信queue) 一个队列一个路由键

 正常交换机绑定正常queue 绑定路由键 同理

-> 2.3.2 思路二

一个交换机  两个不同路由键 然后绑定(本文使用)


3. 案例代码

3.1 简单介绍案例

服务A发起请求到 rabbitmq,  服务B监听并处理消息, 报错了, 重试了五次还不行后 , 进入死信队列

3.2 声明交换机 队列 以及绑定路由键

    @Bean
    public DirectExchange pzyExchange() {
//        return new DirectExchange("pzy_exchange", true, false);
        return ExchangeBuilder.directExchange("pzy_exchange").build();
    }

    @Bean
    public Queue deadLetterQueue() {
        return QueueBuilder.durable("order_dead_queue").build();
    }

    @Bean
    public Binding deadBinding(Queue deadLetterQueue, DirectExchange pzyExchange) {
        return BindingBuilder.bind(deadLetterQueue).to(pzyExchange).with("orderDeadRoutingKey");
    }

    @Bean
    public Binding normalBinding(Queue normalLetterQueue, DirectExchange pzyExchange) {
        return BindingBuilder.bind(normalLetterQueue).to(pzyExchange).with("orderNormalRoutingKey");
    }

    @Bean
    public Queue normalLetterQueue() {
        Map<String, Object> arguments = new HashMap<>(3);
        arguments.put("x-dead-letter-exchange", "pzy_exchange");
        arguments.put("x-dead-letter-routing-key", "orderDeadRoutingKey");
        arguments.put("x-max-length", 200);

        return QueueBuilder.durable("order_normal_queue").withArguments(arguments).build();
    }

3.3 修改配置文件

微服务: 04-springboot中rabbitmq配置,消息回收,序列化方式

3.4 发送消息

rabbitTemplate.convertAndSend("pzy_exchange", "orderNormalRoutingKey", "我是消息");

 3.5 接收消息(自动确认)

自动确认, 在重试结束后, 自动进入死信队列

(手动确认的下文在介绍)

@RabbitListener(queues = "#{normalLetterQueue.name}")
    public void oldHoldInNewPurchaseData(Message message, String message1, Channel channel) throws IOException {

        log.info("获取到mq消息,消息内容为{}", message);


        log.info("mq接收到的对象===>{}", aixiPurchaseRequestDTO);
//        System.out.println(map);

        try {

//            int i = new Random().nextInt(5);

//            if (i > 1) throw new OrderServiceException(ResponseEnum.E40008, "后端测试报错回收机制!");//60% 概率报错
//            if (true) throw new OrderServiceException(ResponseEnum.E40008, "后端测试报错回收机制!");//100% 报错
           

//            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);

        } catch (Exception e) {
            e.printStackTrace();

            log.error("异常===> {}", e.getMessage());

            throw new OrderServiceException(ResponseEnum.E40008, e.getMessage());
        } finally {
//            channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
        }


    }

3.6 开启测试代码

第一个判断(60%): 是查看是否在第一次报错后续消费成功后 是否进入死信队列

第二个判断(100%): 是测试重试机制(次数)过后 是否进入死信队列

抛出 throw new RuntimeException("测试报错!") 就可以

int i = new Random().nextInt(5);
if (i > 1) throw new OrderServiceException(ResponseEnum.E40008, "后端测试报错回收机制!");//五分之三概率报错
//if (true) throw new OrderServiceException(ResponseEnum.E40008, "后端测试报错回收机制!");//五分之三概率报错

3.7 测试结果

---> 3.7.1 查看交换机

有没有绑定两个路由键(没有查看绑定配置)

微服务: 05-rabbitmq设置重试次数并设置死信队列,# 分布式必备服务配置,微服务,rabbitmq,java,spring cloud,spring boot

 ---> 3.7.2 查看队列微服务: 05-rabbitmq设置重试次数并设置死信队列,# 分布式必备服务配置,微服务,rabbitmq,java,spring cloud,spring boot

 ---> 3.7.3 主要查看方向

查看是不是最后一次报错后 才进入死信队列

报错异常是不是无限制循环报错

---> 3.7.4 另外遇到问题 别慌

先把交换机和队列都删了 然后再重试

[如果生产者和消费者配置是独立的 看看队列声明时是否相同, 不同删了队列重启项目]


 文章来源地址https://www.toymoban.com/news/detail-583041.html

到了这里,关于微服务: 05-rabbitmq设置重试次数并设置死信队列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【RabbitMQ】RabbitMQ高级:死信队列和延迟队列

    在电商平台下单,订单创建成功,等待支付,一般会给30分钟的时间,开始倒计时。如果在这段时间内用户没有支付,则默认订单取消。 该如何实现? 定期轮询(数据库等) 用户下单成功,将订单信息放入数据库,同时将支付状态放入数据库,用户付款更改数据库状态。定

    2024年01月17日
    浏览(43)
  • RabbitMQ - 死信队列,延时队列

    死信队列: DLX 全称(Dead-Letter-Exchange),称之为死信交换器,当消息变成一个死信之后,如果这个消息所在的队列存在 x-dead-letter-exchange 参数,那么它会被发送到x-dead-letter-exchange对应值的交换器上,这个交换器就称之为死信交换器,与这个死信交换器绑定的队列就是死信队列

    2024年02月09日
    浏览(36)
  • RabbitMQ-死信交换机和死信队列

    DLX: Dead-Letter-Exchange 死信交换器,死信邮箱 当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就是DLX。 如下图所示: 其实死信队列就是一个普通的交换机,有些队列的消息成为死信后,(比如过期了或者队列满了)这些死信一般情况下是会被 RabbitMQ 清理

    2024年02月08日
    浏览(35)
  • RabbitMQ延迟队列,死信队列配置

    延迟和死信队列的配置 延迟队列有效期一分钟,后进入死信队列,如果异常就进入异常队列 异常队列配置类

    2024年02月14日
    浏览(39)
  • 什么是mq?可靠性、重复消息、重复消费、丢失、发送大文件、延迟、发送机制、重试、死信、幂等、有序、大小、过期、优先级、进了死信队列还能出来吗?

    “MQ” 指的是消息队列(Message Queue),是一种用于异步通信的技术。消息队列是一种中间件,用于在分布式系统中传递消息,使不同组件之间能够进行松散耦合的通信。它的核心思想是生产者将消息发送到队列,而消费者从队列中接收并处理消息。 消息队列的主要优点包括

    2024年02月06日
    浏览(37)
  • Rabbitmq死信队列及延时队列实现

    问题:什么是延迟队列 我们常说的延迟队列是指消息进入队列后不会被立即消费,只有达到指定时间后才能被消费。 但RabbitMq中并 没有提供延迟队列功能 。那么RabbitMQ如何实现延迟队列 通过:死信队列 + RabbitMQ的TTL特性实现。 实现原理 给一个普通带有过期功能的队列绑定一

    2024年02月15日
    浏览(33)
  • 【RabbitMQ笔记10】消息队列RabbitMQ之死信队列的介绍

    这篇文章,主要介绍消息队列RabbitMQ之死信队列。 目录 一、RabbitMQ死信队列 1.1、什么是死信队列 1.2、设置过期时间TTL 1.3、配置死信交换机和死信队列(代码配置) (1)设置队列过期时间 (2)设置单条消息过期时间 (3)队列设置死信交换机 (4)配置的基本思路 1.4、配置

    2024年02月16日
    浏览(49)
  • 【RabbitMQ学习日记】——死信队列与延迟队列

    死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说, producer 将消息投递到 broker 或者直接到 queue 里了, consumer 从 queue 取出消息进行消费,但某些时候 由于特定的原因导致 queue 中的某些消息无法被消费 ,这样的消息如果没有后续的处理,就变成了死

    2024年02月06日
    浏览(41)
  • 【RabbitMQ教程】第五章 —— RabbitMQ - 死信队列

                                                                       💧 【 R a b b i t M Q 教 程 】 第 五 章 — — R a b b i t M Q − 死 信 队 列 color{#FF1493}{【RabbitMQ教程】第五章 —— RabbitMQ - 死信队列} 【 R a b b i t M Q 教 程 】 第 五 章 — — R a

    2024年02月09日
    浏览(29)
  • RabbitMQ: 死信队列

    其实就是一个普通的队列,绑定号私信交换机,不给ttl,给上匹配的路由,等待交换机发送消息。 1.在消费者里的RabbitMQConfig配置类里,创建队列,给它加参数 第四个参数,就是放入这个队列,的一些属性参数 也就是这两个位置 对应Java代码里好像少个参数,排他性,是指,

    2024年02月09日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包