高并发系统设计:消息队列的三大作用:削峰填谷、异步处理、模块解耦

article/2025/9/15 19:25:41

削去秒杀场景下的峰值写流量

而在秒杀场景下,高并发的写请求并不是持续的,也不是经常发生的,而只有在秒杀活动开始后的几秒或者十几秒时间内才会存在。为了应对这十几秒的瞬间写高峰,将秒杀请求暂存在消息队列中,然后业务服务器会响应用户“秒杀结果正在计算中”,释放了系统资源之后再处理其它用户的请求。

在后台启动若干个队列处理程序,消费消息队列中的消息,再执行校验库存、下单等逻辑。因为只有有限个队列处理线程在执行,所以落入后端数据库上的并发请求是有限的。而请求是可以在消息队列中被短暂地堆积,当库存被消耗完之后,消息队列中堆积的请求就可以被丢弃了。

这就是消息队列在秒杀系统中最主要的作用:削峰填谷,也就是说它可以削平短暂的流量高峰,虽说堆积会造成请求被短暂延迟处理,但是只要时刻监控消息队列中的堆积长度,在堆积量超过一定量时,增加队列处理机数量,来提升消息的处理能力就好了,而且秒杀的用户对于短暂延迟知晓秒杀的结果,也是有一定容忍度的。

这里需要注意一下,所说的是“短暂”延迟,如果长时间没有给用户公示秒杀结果,那么用户可能就会怀疑你的秒杀活动有猫腻了。所以,在使用消息队列应对流量峰值时,需要对队列处理的时间、前端写入流量的大小,数据库处理能力做好评估,然后根据不同的量级来决定部署多少台队列处理程序,这里要根据平均请求时间和商品秒杀总量来计算,设定处理机的数量。

比如你的秒杀商品有1000件,处理一次购买请求的时间是500ms,那么总共就需要500s的时间。这时,你部署10个队列处理程序,那么秒杀请求的处理时间就是50s,也就是说用户需要等待50s才可以看到秒杀的结果,这是可以接受的。这时会并发10个请求到达数据库,并不会对数据库造成很大的压力。

通过异步处理简化秒杀请求中的业务流程

还是刚才的秒杀场景下,我们在处理购买请求时,需要500ms。分析了一下整个的购买流程,发现这里面会有主要的业务逻辑,也会有次要的业务逻辑:比如说,主要的流程是生成订单、扣减库存;次要的流程可能是我们在下单购买成功之后会给用户发放优惠券,会增加用户的积分。

假如发放优惠券的耗时是50ms,增加用户积分的耗时也是50ms,那么如果我们将发放优惠券、增加积分的操作放在另外一个队列处理机中执行,那么整个流程就缩短到了400ms,性能提升了20%,处理这1000件商品的时间就变成了400s。如果我们还是希望能在50s之内看到秒杀结果的话,只需要部署8个队列程序就好了。

解耦实现秒杀系统模块之间松耦合

比如数据团队对你说,在秒杀活动之后想要统计活动的数据,借此来分析活动商品的受欢迎程度等等指标。这时需要将大量的数据发送给数据团队。

一个思路是:可以使用HTTP或者RPC的方式来同步地调用,也就是数据团队这边提供一个接口,我们实时将秒杀的数据推送给它,但是这样调用会有两个问题:

  • 整体系统的耦合性比较强,当数据团队的接口发生故障时,会影响到秒杀系统的可用性。
  • 当数据系统需要新的字段,就要变更接口的参数,那么秒杀系统也要随着一起变更。

这时可以考虑使用消息队列降低业务系统和数据系统的直接耦合度。

秒杀系统产生一条购买数据后,我们可以先把全部数据发送给消息队列,然后数据团队再订阅这个消息队列的话题,这样它们就可以接收到数据,然后再做过滤和处理了。解耦合之后,数据系统的故障就不会影响到秒杀系统了,同时,当数据系统需要新的字段时,只需要解析消息队列中的消息,拿到需要的数据就好了。


http://chatgpt.dhexx.cn/article/W3R592se.shtml

相关文章

Java曲线之削峰填谷,科学网—Lorenz曲线之削峰填谷 - 李宁的博文

我给黄小邪同学的置顶博文《中科院研究生入学考试的Lorenz曲线》(http://blog.sciencenet.cn/home.php?modspace&uid480705&doblog&id706263) 留言说:“建议模拟一个李小文老师所假设的双峰分布(其实可以做N峰分布,N大于等于2),…

并发编程之削峰填谷

背景 在系统的某个阶段,并发访问数(流量)会急剧膨胀,在瞬时时间内(1秒或数秒),达到一个临界点,许多系统往往在这个阶段奔溃而失去响应,比如商家促销活动进行秒杀,或618,双11等等。系统在其他时间业务压力往…

基于SAC在citylearn模块实现电力需求曲线的削峰填谷———调参记录2

参考几篇DRL调参技巧总结 https://zhuanlan.zhihu.com/p/345353294 https://zhuanlan.zhihu.com/p/434495366 1 增大batch size,减小样本误差 减小辅助reward,使其不影响最终reward,并使其正负均衡 辅助reward属于在每个step均出现&#xf…

电动汽车,削峰填谷

MATLAB代码:面向削峰填谷的电动汽车多目标优化调度策略 关键词:电动汽车 削峰填谷 多目标 充放电优化 参考文档:店主自己整理的说明文档,公式、约束、数据齐全,可联系我查看 仿真平台:MATLAB YALMIPCPLEX 优…

《面试补习》--来聊聊削峰填谷!

概述 今天想和大家聊聊削峰填谷,最近 B 站发生的机房断电事件,和A站的服务雪崩,让我们对高可用关注了起来,之前梳理了高可用三剑客 限流,熔断和降级,今天想继续聊聊削峰填谷,也为后面的高性能篇 做一下铺垫…

电动汽车有序充电参与电网负荷削峰填谷

电动汽车有序充电参与电网负荷削峰填谷。 ID:24400645773662896

考虑储能削峰填谷的含DG配电网可靠性评估

考虑储能削峰填谷的含DG配电网可靠性评估。 1、基于序贯蒙特卡洛的配电网可靠性评估; 2、基于序贯蒙特卡洛的含DG配电网可靠性评估; 3、基于区间迭代法优化储能出力进行削峰填谷; 4、基于上述内容进一步考虑配电网可靠性。 (MATLA…

进度模型方法论,利用“削峰填谷”进行资源优化

对进度模型中的活动进行调整,从而使资源使用情况满足资源限制要求,这种技术就是资源平滑。如下图所示。 资源平滑不会改变项目关键路径,完工日期也不会延迟。 利用此方法,我们可以采用一种削峰填谷的方式对进度网络进行资源优化。如下图为某项目在一段时间内的资源使用曲…

利用RabbitMQ实现消息投递削峰填谷

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

【2023A题】电采暖负荷参与电力系统功率调节的技术经济分析(思路、代码)

目录 💥1 概述 📚2 Matlab代码实现 🎉3 参考文献 🌈4 运行结果 💥1 概述 建设以新能源为主体的新型电力系统是应对全球气候变化挑战的重要举措。高比例新能源接入导致电力系统调节能力稀缺,亟需开发新的调…

面向削峰填谷的电动汽车多目标优化调度策略

面向削峰填谷的电动汽车多目标优化调度策略 关键词:电动汽车 削峰填谷 多目标 充放电优化 参考文档:自己整理的说明文档,公式、约束、数据齐全 仿真平台:MATLAB YALMIPCPLEX 主要内容:代码主要实现了考虑电动汽车参与…

【电动车】基于削峰填谷的电动汽车多目标优化调度策略研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

面向削峰填谷的电动汽车多目标优化调度策略——附代码

目录 摘要: 背景介绍: 考虑V2G的电动汽车充放电模型(无非凸约束) 基于负荷实时变化的分时电价模型 充放电优化调度目标函数 (1)综合负荷成本以及电动汽车电池退化损耗成本 (2&#xff09…

充电站储能削峰填谷方案设计测算报告

1、背景 近年来,为推进我国储能技术朝着商业化应用发展,国家出台了多项政策。从现有政策解读可知,虽然国家鼓励在用户侧建设分布式储能系统,但暂未出台针对用户侧电池储能的充放电标杆电价、容量补贴细则、充放电补贴细则、用户容…

MQ如何快速实现流量削峰填谷

问:站点与服务,服务与服务上下游之间,一般如何通讯? 答:有两种常见的方式 一种是“直接调用”,通过RPC框架,上游直接调用下游。 在某些业务场景之下(具体哪些业务场景,见…

削峰填谷,你只知道消息队列?

https://baijiahao.baidu.com/s?id1707302054121107350&wfrspider&forpc 概述 今天想和大家聊聊削峰填谷,最近 B 站发生的机房断电事件,和A站的服务雪崩,让我们对高可用关注了起来,之前梳理了高可用三剑客 限流&#xff…

21.面向削峰填谷的电动汽车多目标优化调度策略

说明书 MATLAB代码:面向削峰填谷的电动汽车多目标优化调度策略 关键词:电动汽车 削峰填谷 多目标 充放电优化 参考文档:店主自己整理的说明文档,公式、约束、数据齐全,可联系我查看 仿真平台:MATLAB YA…

MQ,究竟如何做到削峰填谷?

MQ,很多的应用场景,是消息的订阅发布,是系统上下游的解耦,MQ的还有一个典型应用场景是缓冲流量,削峰填谷,本文将简单介绍下,MQ要怎么实现缓冲流量,削峰填谷。 站点与服务上下游之间&…

MQ实战-削峰填谷

对于突然到来的大量请求,您可以配置流控规则,以稳定的速度逐步处理这些请求,起到“削峰填谷”的效果,从而避免流量突刺造成系统负载过高。 1、场景 请求的到来,往往是没有规律的。 例如,某应用的处理能力…

MQ,如何做到削峰填谷

问:为什么会有本文? 答:上一篇文章《到底什么时候该使用MQ?》引起了广泛的讨论,有朋友回复说,MQ的还有一个典型应用场景是缓冲流量,削峰填谷,本文将简单介绍下,MQ要实现…