模拟高并发下RabbitMQ的削峰作用

这篇具有很好参考价值的文章主要介绍了模拟高并发下RabbitMQ的削峰作用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        在并发量很高的时候,服务端处理不过来客户端发的请求,这个时候可以使用消息队列,实现削峰。原理就是请求先打到队列上,服务端从队列里取出消息进行处理,处理不过来的消息就堆积在消息队列里等待。

可以模拟一下这个过程:

        发送方把10万条消息在短时间内发送到消息队列

        接收方把这些消息存储到数据库

目录

一、具体实现

1. 创建两个spring项目

2. 分别引入 RabbitMQ 的依赖

3. 配置文件中配置RabbitMQ的信息(这里是.yml文件的格式)

4. 发送方 Sender

发送消息

 多线程实现Runnable接口

 测试类

5. 接收方

二、结果


一、具体实现

1. 创建两个spring项目

2. 分别引入 RabbitMQ 的依赖

<!--        rabbitMQ 依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

3. 配置文件中配置RabbitMQ的信息(这里是.yml文件的格式)

spring:
  rabbitmq:
    host: 这里写IP地址
    port: 5672 #端口号
    username: 用户名
    password: 密码
    virtual-host: /

4. 发送方 Sender

发送消息

@Component
public class Sender {
    @Autowired
    private AmqpTemplate rabbitTemplate;

    public void send(String str) {
        //first是消息队列的名称
        rabbitTemplate.convertAndSend("first", str);
    }
}

 多线程实现Runnable接口

@Data
public class MyRunnable implements Runnable {
    private String str;
    private Sender sender;
    private CountDownLatch countDownLatch;
    public MyRunnable(CountDownLatch countDownLatch,Sender sender, String str){
            this.countDownLatch = countDownLatch;
        this.sender = sender;
        this.str = str;
    }
    @Override
    public void run() {
        try {
            String threadName = Thread.currentThread().getName();
            //发送线程名和消息
            sender.send(threadName + " " + str);
            //控制台输出
            System.out.println(threadName + " " + str);
            countDownLatch.countDown();
        } catch (Exception e) {
            System.out.println(new Date() + " Send mq message failed.");
            e.printStackTrace();
        }
    }
}

 测试类

@SpringBootTest
class Rabbitmq1ApplicationTests {
    @Autowired
    Sender sender;
    @Test
    void contextLoads() throws InterruptedException {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 10,
                300, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>());
        //循环100000次,模拟10万条消息
        final int count = 100000;
        CountDownLatch countDownLatch = new CountDownLatch(count);
        for(int i = 0; i < count; i++){
            MyRunnable myRunnable = new MyRunnable(countDownLatch,sender,"" + i);
            threadPoolExecutor.execute(myRunnable);
        }
        countDownLatch.await();
    }
}

5. 接收方

@Component
@RabbitListener(queues = "first")
public class Receiver {
    @Autowired
    MessageService messageService;
    @RabbitHandler
    public void process(String str){
        //控制台输出
        System.out.println("msg: " + str);
        //对消息的处理,字符串分割
        String[] strings = str.split(" ");
        Message message = new Message(strings[0],strings[1]);
        //插入数据库
        messageService.insert(message);
    }
}

这里@RabbitListener注解监听着 first 队列 ,当有收到消息的时候,就交给 @RabbitHandler 的方法处理。

二、结果

可以看到发送方很快就发送完毕了,接收方这边还在慢慢的处理中

过了一会。。。

模拟高并发下RabbitMQ的削峰作用

 又过了一会。。。

模拟高并发下RabbitMQ的削峰作用

 完美地发挥了削峰的作用。文章来源地址https://www.toymoban.com/news/detail-509434.html

到了这里,关于模拟高并发下RabbitMQ的削峰作用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • mysql高并发下主键自增打来的问题

    在一般情况下,在新增领域对象后,都需要获取对应的主键值。使用应用层来维护主键,在一定程度上有利于程序性能的优化和应用移植性的提高。在采用数据库自增主键的方案里,如果JDBC驱动不能绑定新增记录对应的主键,就需要手工执行查询语句以获取对应的主键值,对

    2024年02月13日
    浏览(38)
  • 短信发送+实现高并发下高可用(HTTP连接池+异步)

    依赖注入 application.properties SmsComponent SmsConfig RestTemplateConfig(使用HTTP协议请求) 测试 异步配置 使用异步

    2024年02月09日
    浏览(36)
  • 高并发下数据一致性问题:数据库+缓存双写模式分析

    随着互联网业务的发展,其中越来越多场景使用了缓存来提升服务质量。从系统角度而言, 缓存的主要目标是减轻数据库压力(特别是读取压力)并提高服务响应速度 。引入缓存就不可避免会涉及到缓存与业务数据库数据一致性的问题,而不同的业务场景对数据一致性的要

    2024年02月09日
    浏览(45)
  • 【HBZ分享】高并发下Redis+Nginx+Lua+Canal架构体系设计

    设计简单,可以支持普通并发现的大部分需求,但如果并发太高,该方案依然无法支撑。 瓶颈卡在tomcat的并发量低 通过lua直连redis nginx判断是否从nginx中直接获取缓存,如果需要获取,则通过lua直接去redis读取,并返回,整个过程不需要经历应用程序这层,所以性能很高,单

    2024年02月12日
    浏览(48)
  • 08 - 网络通信优化之IO模型:如何解决高并发下IO瓶颈?

    提到 Java I/O,相信你一定不陌生。你可能使用 I/O 操作读写文件,也可能使用它实现 Socket 的信息传输…这些都是我们在系统中最常遇到的和 I/O 有关的操作。 我们都知道,I/O 的速度要比内存速度慢,尤其是在现在这个大数据时代背景下,I/O 的性能问题更是尤为突出,I/O 读写

    2024年02月12日
    浏览(47)
  • 腾讯二面:如何保证接口幂等性?高并发下的接口幂等性如何实现?

    什么是接口幂等性 接口幂等性这一概念源于数学,原意是指一个操作如果连续执行多次所产生的结果与仅执行一次的效果相同,那么我们就称这个操作是幂等的。在互联网领域,特别是在Web服务、API设计和分布式系统中,接口幂等性具有非常重要的意义。 具体到HTTP接口或者

    2024年03月19日
    浏览(47)
  • 高并发下缓存失效问题(穿透、雪崩、击穿),以及本地锁、Redis分布锁、Redisson锁、SpringCache使用

    说明 :以不存在的数据攻击,数据库压力增加导致崩溃 风险 :利用不存在数据攻击,数据库瞬时压力增大,导致崩溃 解决 :设置不存在数据为 null 值 与 短暂过期时间 布隆过滤器 使用案例: redission布隆过滤器解决缓存穿透问题,定时刷新bloomFilter中的数据 说明 :设置缓

    2024年02月08日
    浏览(54)
  • Go学习圣经:队列削峰+批量写入 超高并发原理和实操

    本文是《Go学习圣经》 的第二部分。 第一部分请参见:Go学习圣经:0基础精通GO开发与高并发架构(1) 现在 拿到offer超级难 ,甚至连面试电话,一个都搞不到。 尼恩的技术社群中(50+),很多小伙伴凭借 “左手云原生+右手大数据”的绝活,拿到了offer,并且是非常优质的

    2024年02月06日
    浏览(40)
  • 利用RabbitMQ实现消息投递削峰填谷

    目录 异步和同步如何选择 异步线程 同步收发消息 一、导入依赖库 二、创建RabbitMQ配置类 三、创建消息任务类 ·依靠多线程,Java代码可以同步执行也可以异步执行 ·RabbitMQ提供了同步和异步两种收发消息模式 ·我们采用 Java异步线程 MQ同步收发消息 在 pom.xml 文件中添加Ra

    2024年02月12日
    浏览(40)
  • 深入理解高并发下的MySQL与Redis缓存一致性问题(增删改查数据缓存的一致性、Canal、分布式系统CAP定理、BASE理论、强、弱一致性、顺序、线性、因果、最终一致性)

    一些小型项目,或极少有并发的项目,这些策略在无并发情况下,不会有什么问题。 读数据策略:有缓存则读缓存,然后接口返回。没有缓存,查询出数据,载入缓存,然后接口返回。 写数据策略:数据发生了变动,先删除缓存,再更新数据,等下次读取的时候载入缓存,

    2024年03月20日
    浏览(54)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包