首页 > 其他分享 >MQ核心作用异步&削峰&解耦使用场景详解

MQ核心作用异步&削峰&解耦使用场景详解

时间:2024-10-08 15:12:24浏览次数:6  
标签:异步 处理 系统 削峰 MQ public

说在前面

在如今的高并发互联网应用中,如何确保系统在巨大的流量冲击下还能稳稳当当运转,是每个技术团队都会遇到的挑战。说到这,消息队列(MQ) 就是背后的“大功臣”了。

无论是异步处理请求、平滑应对流量高峰,还是让各个系统模块相互独立不“拖后腿”,MQ 都是不可或缺的帮手。那么,MQ 是怎么削峰的?或者它是如何让复杂系统解耦的? 今天我们就来聊聊 MQ 的这三大核心功能,看它是如何助力系统高效、稳定运转的。

1. 什么是 MQ(消息队列)?

消息队列(Message Queue,简称 MQ)其实就是一个“管道”,用来在不同的系统或服务之间传递消息。

想象一下,它像是邮局,发信人把信件交给邮局,邮局再按照顺序把信送到收件人手中,整个过程大家各做各的事,发信人不用担心收件人有没有立刻收到信,这样大家的工作互不干扰。
image

在系统中,MQ 主要负责消息的传递和异步处理。它帮助系统之间进行消息传递,同时还能实现系统的解耦和高效的异步处理。常见的 MQ 工具包括 RabbitMQ、Kafka、ActiveMQ 等。

2. MQ的核心作用一:异步

异步 是 MQ 最重要的作用之一。所谓异步,就是说你不用等到一个任务完成再进行下一个操作,而是把任务交给 MQ 处理,自己可以继续做别的事情。这就好比你把某项任务外包给了一个帮手(MQ),然后自己继续处理其他工作,等 MQ 把任务完成后,你再去处理结果。

image

使用异步 MQ 的好处:

  • 提高系统性能:不用等待任务完成,能立即处理其他任务。
  • 用户体验更好:用户发起请求后,系统快速响应,而后台的复杂操作可以慢慢处理。

举个例子:

在电商系统中,用户下单后,系统需要给仓库发通知,让他们准备发货。如果没有 MQ,系统可能会等到仓库那边处理完才告诉用户下单成功,这样用户就得等很久。

但有了 MQ,系统可以先快速告诉用户“订单已成功”,后续的仓库处理则通过 MQ 异步通知,用户不用等待后台所有流程结束。

最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。这是大佬写的,7701页的BAT大佬写的刷题笔记,让我offer拿到手软

示例代码(Spring Boot RabbitMQ):

// 生产者:将消息发送到消息队列
@Component
public class OrderProducer {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void sendOrderMessage(String orderId) {
        rabbitTemplate.convertAndSend("orderQueue", orderId);  // 异步发送订单消息
    }
}

// 消费者:从队列中接收消息并处理
@Component
@RabbitListener(queues = "orderQueue")
public class OrderConsumer {

    @RabbitHandler
    public void handleOrderMessage(String orderId) {
        // 模拟订单处理逻辑
        System.out.println("Processing order: " + orderId);
    }
}

在这个例子中,OrderProducer 会把订单消息发送到 orderQueue 队列,OrderConsumer 异步处理订单,用户不会感受到后台的复杂逻辑,只会收到下单成功的反馈。

3. MQ的核心作用二:削峰

削峰 是 MQ 的另一个核心作用。削峰的意思就是把系统中突然涌入的高并发请求“削平”,让系统在面对流量激增时不至于崩溃。它就像一个“水库”,把瞬间涌入的洪水存储起来,等流量回归正常后,再慢慢放出处理。

image

使用削峰 MQ 的好处:

  • 防止系统过载:面对突发的高并发流量,系统不会因为超出负载而崩溃。
  • 平滑处理流量:高峰时段通过 MQ 把请求排队,等流量稳定后再逐步处理,保证系统不会因为短时间的流量激增导致性能下降。

举个例子:

在秒杀活动中,用户同时发起大量请求,如果系统直接处理这些请求,服务器可能会崩溃。通过 MQ,可以先把这些请求排队,等流量稳定后,系统再逐步处理队列中的请求。这样不仅能保障服务器的稳定,还能让用户体验到秒杀服务的顺畅。

示例代码:

// 秒杀请求发送到消息队列中进行削峰处理
@Component
public class SeckillProducer {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void sendSeckillMessage(String seckillId) {
        rabbitTemplate.convertAndSend("seckillQueue", seckillId);  // 秒杀请求排队
    }
}

// 消费者从队列中获取秒杀请求,按顺序处理
@Component
@RabbitListener(queues = "seckillQueue")
public class SeckillConsumer {

    @RabbitHandler
    public void handleSeckillMessage(String seckillId) {
        // 模拟处理秒杀请求逻辑
        System.out.println("Processing seckill request: " + seckillId);
    }
}

通过 MQ 把秒杀请求排队,可以平滑处理突发流量,避免系统短时间内因为并发量太大而崩溃。

最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。这是大佬写的,7701页的BAT大佬写的刷题笔记,让我offer拿到手软

4. MQ的核心作用三:解耦

解耦 是 MQ 的第三大作用,简单来说就是让系统模块之间互不干扰,减少系统之间的依赖。在没有 MQ 的情况下,系统 A 和系统 B 可能需要直接进行同步通信,但这样耦合度太高,如果某个系统出现问题,另一个系统也会受到影响。

有了 MQ 之后,系统 A 不需要等系统 B 处理完,它只需要把消息发送到 MQ,系统 B 根据自己的情况异步处理消息。这样系统 A 和系统 B 之间就实现了解耦,A 不用管 B 是否忙碌,B 也不需要马上响应 A 的请求。

使用解耦 MQ 的好处:

  • 降低系统之间的依赖:每个系统可以独立处理自己的逻辑,互不影响。
  • 提高系统灵活性:系统之间通过 MQ 通信,如果某个系统宕机,MQ 可以暂存消息,待系统恢复后继续处理。

举个例子:

在电商系统中,订单服务和库存服务需要通信。如果没有 MQ,订单系统下单后必须等待库存系统确认库存后才能继续处理。但通过 MQ,订单系统下单后,可以把消息发到 MQ 里,库存系统慢慢去处理,不会影响订单服务的流程。
image

示例代码:

// 订单系统发送消息到库存系统
@Component
public class InventoryProducer {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void sendInventoryMessage(String orderId) {
        rabbitTemplate.convertAndSend("inventoryQueue", orderId);  // 订单消息发送到库存服务
    }
}

// 库存系统异步处理订单消息
@Component
@RabbitListener(queues = "inventoryQueue")
public class InventoryConsumer {

    @RabbitHandler
    public void handleInventoryMessage(String orderId) {
        // 模拟库存扣减逻辑
        System.out.println("Processing inventory for order: " + orderId);
    }
}

通过 MQ 实现解耦后,订单服务可以快速响应用户的下单操作,而库存服务则异步处理库存扣减操作,两个系统之间互不干扰,降低了耦合度。

最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。这是大佬写的,7701页的BAT大佬写的刷题笔记,让我offer拿到手软

5. 使用场景详解

5.1 异步通知

在异步通知的场景下,MQ 能够帮助系统及时响应用户的请求,同时后台慢慢处理后续逻辑。比如:

  • 用户注册后发送欢迎邮件:当用户注册成功后,系统通过 MQ 异步发送邮件,不用阻塞用户的注册流程。
  • 订单完成后发送优惠券:用户完成订单后,优惠券通过 MQ 异步发放,订单流程不会被拖慢。

5.2 削峰场景

在高并发场景下,MQ 可以有效地进行削峰处理。比如:

  • 电商秒杀活动:在秒杀活动中,大量用户同时请求,MQ 通过把请求排队来平滑处理流量,避免服务器崩溃。
  • 支付系统高峰期:当大量用户发起支付请求时,MQ 可以帮助系统按顺序处理,避免并发过高导致支付系统瘫痪。

5.3 系统解耦

在需要解耦的场景下,MQ 是一个理想的选择。比如:

  • 电商系统中的订单与库存解耦:订单服务和库存服务通过 MQ 进行异步通信,避免耦合过高导致的问题。
  • 日志系统与业务系统解耦:日志系统可以通过 MQ 收集各个模块的日志信息,业务系统只需把日志发给 MQ,不需要直接与日志系统通信。

6. 总结

MQ(消息队列) 的核心作用主要体现在异步处理、削峰和解耦

  • 通过异步处理,系统可以提升响应速度,提高用户体验;
  • 通过削峰,系统可以在面对高并发流量时稳定运行,避免过载;
  • 通过解耦,系统之间可以减少依赖,提升灵活性和可维护性。

无论是在电商系统的订单处理、秒杀场景,还是系统模块的解耦设计中,MQ 都是一个强大的工具。通过 MQ,系统能够更好地应对复杂的业务场景和高并发需求,保持稳定、高效的运行。

最后说一句(求关注,求赞,别白嫖我)

最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。
这是大佬写的, 7701页的BAT大佬写的刷题笔记,让我offer拿到手软

本文,已收录于,我的技术网站 cxykk.com:程序员编程资料站,有大厂完整面经,工作技术,架构师成长之路,等经验分享

求一键三连:点赞、分享、收藏

点赞对我真的非常重要!在线求赞,加个关注我会非常感激!

标签:异步,处理,系统,削峰,MQ,public
From: https://www.cnblogs.com/jiang-xiao-bei/p/18451685

相关文章

  • RabbitMQ学习心得体会之Exchange
    参考:https://www.rabbitmq.com/tutorials/tutorial-three-dotnet在工作队列中,一个消息只会投递一个消费者,但是发布订阅模式,同一个消息可以发送个多个消费者。(交换)ExchangesrabbitMQ的核心是把生产者把消息发送给exchange,这个x一边是从p接收消息,一边是把这些消息推送给队列。生......
  • 异步FIFO的空和满是准确的吗
    关注公众号FPGA开源工坊获取更多FPGA相关内容交流群:838607138异步FIFO的空和满是准确的吗在我们关于两级同步器电路那篇推文里面提到了异步FIFO中格雷码进行同步的时候是允许漏采的,那么这个漏采会出问题吗,这篇推文我们就来讨论一下这个问题。首先来说明一下异步FIFO的空满信号......
  • `std::future`--异步的优势
    std::future相比于直接使用线程在C++中有几个重要的优势,主要体现在同步结果获取、简化代码管理、以及更安全的异步任务管理等方面。以下是std::future的一些主要优势:1.自动结果获取与同步std::future提供了一种便捷的机制来获取异步任务的返回值。当我们使用线程时,通常......
  • prometheus学习笔记之PromQL
    prometheus学习笔记之PromQL一、PromQL语句简介官方文档:https://prometheus.io/docs/prometheus/latest/querying/basics/Prometheus提供⼀个函数式的表达式语⾔PromQL(PrometheusQueryLanguage),可以使⽤户实时地查找和聚合时间序列数据,表达式计算结果可以在图表中展示,也可......
  • RocketMQ 必知概念
    延迟消息延迟等级官方默认设置了18哥延迟等级1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h发送延迟消息:按照默认顺序1-18数字就对应上面的延迟时间Messagemsg=newMessage(TOPIC,TAG,"OrderID199","ok",getBytes(StandardCharsets.UTF_8));//......
  • Nodered学习记录-MQTT
    安装EMQXEMQX(以前称为EMQ)是一个开源的、高度可扩展且高可用的分布式MQTT消息代理,专为物联网(IoT)、机器对机器(M2M)通信和移动应用程序设计。它支持MQTT和其他IoT协议如CoAP/LwM2M,能够处理数百万并发连接,并提供强大的消息路由能力。通过docker安装官方文档$dockerpullem......
  • django + redis + celery 异步任务
    目录结构E:.│db.sqlite3│Dockerfile│manage.py│requirements.txt│├─celery_tasks#自定义一个celery的工作目录││config.py#celery配置文件││__init__.py│││├─sms│tasks.py#worker任务│__init__.py│......
  • C# - 异步编程 - BackgroundWorker 类
    后台线程,BackgroundWorker类用于创建一个线程,在后台持续运行以完成某项工作,并不时地与主线程通信。BackgroundWorker类的属性,方法与事件。属性:WorkerReportsProgress:设置后台任务是否可以把它的进度汇报给主线程。WorkerSupportsCancellation:是否支持从主线程取消。IsB......
  • P6109 [Ynoi2009] rprmq1
    优美的数据结构题。这题先修改再查询,基本明确了要使用扫描线做这道题。我们将第一维视为时间,那么我们对于一个操作,将其变为时刻\(l_1\)时,在区间\([l_2,r_2]\)加上\(x\),时刻\(r_1+1\)时,在区间\([l_2,r_2]\)减去\(x\)。然后对于一个查询,相当于是要求区间\([l_2,r_2]\)......
  • 速通RabbitMQ
     MQ三大重要特性:解耦,异步,削峰RABBITMQ:1.rabbitMQ有什么使用场景:异步发送消息(邮件,验证码,短信)MYSQL,REDIS,ELASTICSEARCH之间的数据同步分布式事务保持高可用性削峰填谷 2.rabbitMQ如何保证消息不丢失?在正常情况下publisher发送消息至exchange,exchange选择queue,再由q......