RabbitMQ消费者限流实现消息处理优化

 更新时间:2023年05月20日 08:41:45   作者:小白的救赎  
这篇文章主要介绍了RabbitMQ消费者限流实现消息处理优化,消费者限流是用于消费者每次获取消息时限制条数,注意前提是手动确认模式,并且在手动确认后才能获取到消息,感兴趣想要详细了解可以参考下文

目录结构

导入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
        <version>2.5.0</version>
    </dependency>
</dependencies>

修改yml

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    listener:
      simple:
        acknowledge-mode: manual # 手动确认模式
        prefetch: 1 # 每次消费仅1条消息

业务逻辑

为了验证是否一定要手动确认才能真正消费消息,如下我进行了测试:首先我先让生产者生产两条消息在队列当中,如下图1所示。其次再看代码逻辑。当启动了消费者代码后入下图2所示:虽然确确实实被限流了,有一条未确认的消息,但当我们关闭消费者端的应用后,就又会变成图1所示。

图1

/**
 * 消费者的限流机制
 *  1、确保Ack机制为手动机制:acknowledge-mode: manual
 *  2、每次消费消息的个数:prefetch: 1 只有手动确认完后才会拉取下一条消息
 */
@Component
public class QosListener implements ChannelAwareMessageListener {
    @RabbitListener(queues = "test_queue_name")
    @Override
    public void onMessage(Message message, Channel channel) throws Exception {
        System.out.println("消费者接受的消息为:" + new String(message.getBody()));
    }
}

图2

所以可以当我们再次改变业务逻辑:进行手动确认后就可以发现消息确确实实被消费了,如图3所示。要注意哈:第二个是否批量签收参数表示的是开启消费者后是否只会读取一次消息,而消费者限流prefetch表示的是每次读取只能为一条消息。两者的概念是不一样的。

/**
 * 消费者的限流机制
 *  1、确保Ack机制为手动机制:acknowledge-mode: manual
 *  2、每次消费消息的个数:prefetch: 1 只有手动确认完后才会拉取下一条消息
 */
@Component
public class QosListener implements ChannelAwareMessageListener {
    @RabbitListener(queues = "test_queue_name")
    @Override
    public void onMessage(Message message, Channel channel) throws Exception {
        Thread.sleep(5000);
        long deliveryTag = message.getMessageProperties().getDeliveryTag();// 消息的唯一标识id
        System.out.println("消费者接受的消息为:" + new String(message.getBody()));
        channel.basicAck(deliveryTag,true);//每5s读一次消息(限流后每次为一条)
    }
}

到此这篇关于RabbitMQ消费者限流实现消息处理优化的文章就介绍到这了,更多相关RabbitMQ消费者限流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Mybatis的二级缓存配置

    详解Mybatis的二级缓存配置

    这篇文章主要介绍了Mybatis的二级缓存配置的相关资料,需要的朋友可以参考下
    2017-05-05
  • Java中synchronized实现原理详解

    Java中synchronized实现原理详解

    这篇文章主要介绍了Java中synchronized实现原理详解,涉及synchronized实现同步的基础,Java对象头,Monitor,Mark Word,锁优化,自旋锁等相关内容,具有一定借鉴价值,需要的朋友可以参考下。
    2017-11-11
  • Java使用Apache POI操作Excel详解

    Java使用Apache POI操作Excel详解

    在Java中操作Excel是日常工作中经常遇到的问题,而Apache Poi是一种流行且广泛使用的方式,它提供了各种库和工具,所以本文就来详细如何使用Apache Poi来进行Excel文件操作吧
    2023-06-06
  • Java的ArrayList扩容源码解析

    Java的ArrayList扩容源码解析

    这篇文章主要介绍了Java的ArrayList扩容源码解析,通过动态扩容,ArrayList能够在添加元素时保持高效的性能,扩容操作是有一定开销的,但由于扩容的时间复杂度为O(n),其中n是当前元素个数,所以平均情况下,每次添加元素的时间复杂度仍然是O(1),需要的朋友可以参考下
    2024-01-01
  • 全面了解Java中的内部类和匿名类

    全面了解Java中的内部类和匿名类

    下面小编就为大家带来一篇全面了解Java中的内部类和匿名类。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • java中set集合的常用方法详解

    java中set集合的常用方法详解

    本篇文章给大家带来的内容是关于java中set集合的常用方法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。下面我们就来学习一下吧
    2021-11-11
  • 背包问题-动态规划java实现的分析与代码

    背包问题-动态规划java实现的分析与代码

    这篇文章主要给大家介绍了关于背包问题动态规划java实现的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java实现顺序表的增删查改功能

    Java实现顺序表的增删查改功能

    这篇文章主要介绍了Java实现顺序表的增删查改功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Spring Cloud Hystrix的基本用法大全

    Spring Cloud Hystrix的基本用法大全

    这篇文章主要介绍了Spring Cloud Hyxtrix的基本使用,它是Spring Cloud中集成的一个组件,在整个生态中主要为我们提供服务隔离,服务熔断,服务降级功能,本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • Java求出任意数字的各个位数之和方式

    Java求出任意数字的各个位数之和方式

    这篇文章主要介绍了Java求出任意数字的各个位数之和方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01

最新评论