代码编织梦想

一、什么是消息队列

        在学习消息队列之前,先说一下什么是队列。队列可以说是一个数据结构,可以存储数据,如下图,我们从右侧(队尾)插入元素(入队),从队头获取元素(出队)。

        了解了队列之后,我们来看一下什么是消息队列,消息队列就是我们常说的MQ,英文叫Message Queue,是作为一个单独的中间件产品存在的,独立部署。

二、为什么使用消息队列

1.解耦

        使用MQ之前,系统A产生消息系统B和系统C需要系统A的消息,那么就需要系统A去调用系统B和系统C,这样如果再来一个系统D也需要这个消息,就需要修改系统A中的代码。然后测试上线。如果有一天系统B不需要系统A中的消息了,那么还是需要修改系统A中的代码。在修改的过程中还需要考虑会不会影响其他的系统,修改完毕之后测试然后再上线。这样维护系统A的人就会很烦。

        使用MQ之后,系统A只需要负责把消息放到MQ中就不需要管了。也不需要考虑是不是有新的系统需要这个消息,也不需要考虑谁不用了。完全交给MQ去做。系统A和其他系统之间的耦合降低了。

2.异步

Data newData = productData();//系统A经过一些逻辑处理后产生了数据,耗时200ms  
Response responseB = callSysB(newData);//系统A调系统B接口发送数据,耗时300ms 
Response responseC = callSysC(newData);//系统A调系统C接口发送数据,耗时300ms 

        使用MQ之前,系统A产生了一条数据,然后先调用系统B的接口发送数据,然后调用系统C的接口发送数据,最后调用系统D的接口发送数据。200+300+300=800ms。这就会导致响应的非常慢。

Data newData = productData();//系统A经过一些逻辑处理后产生了数据,耗时200ms 
writeDataToMQ(newData);//往MQ里写消息,耗时50ms

        使用MQ之后,系统A产生了一条数据,直接交给MQ就可以了。系统B和系统C自己去MQ中拿慢慢消费就可以了。200+50=250ms。250ms用户就可以得到结果。

3.削峰

        我们大家都知道双十一淘宝京东都会搞活动。双十一这一天会把平时的流量高出几十倍几百倍。如果没有使用MQ下单的信息直接实时操作数据库,就会导致数据库承受的压力太大。数据库挂掉整个系统就不能使用了。如果使用MQ下单的数据只需要往MQ里发送消息,我的订单系统可以设定消费的频率,比如每秒我就消费2000个消息(在数据库的可承受范围),不管你下游系统每秒下多少单,我都保持这个速率,既不会影响我订单系统的数据库,也不影响你下游系统的下单操作,很好的保护了系统。剩余的消息慢慢消费就可以了。

三、如何使用消息队列

1.添加RabbitMQ的依赖

        <!--        amqp依赖,包含RabbitMQ-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

2.添加ReabbitMq配置

spring
    rebbitmq:
        host:IP地址
        port:端口号
        virtual:/
        username:guest
        password:guest

3.编写消息生产者

4.编写消息消费者

 5.测试类

    @Autowired
    private SpringMqProduceTest springMqProduceTest;
    
    @GetMapping("testMq/{message}")
    public String testMq(@PathVariable("message") String message){
        springMqProduceTest.testSimpleQueue("testMq",message);
        return "已发送:"+message;
    }

6.执行结果

 四、总结提升

        对于消息队列足够的了解我们在使用的过程中才会更加的得心应手。我们才能明确什么情况下应该使用消息队列。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45490198/article/details/129628031