MQ,究竟如何做到削峰填谷?
原创
58沈剑
架构师之路
MQ,很多的应用场景,是消息的订阅发布,是系统上下游的解耦,
MQ
的还有一个
典型应用场景
是
缓冲流量,削峰填谷
,本文将简单介绍下,
MQ
要怎么实现缓冲流量
,削峰填谷
。
站点与服务上下游之间,一般如何通讯?
有两种常见的方式。
一种是“
直接调用
”,通过RPC框架,上游直接调用下游。
一种是“
MQ推送
”,上游将消息发给MQ,MQ将消息推送给下游。
这两种方式,能否缓存流量,能否削峰填谷?
不能。不管采用
“
直接调用
”
还是
“
MQ推送
”
,都有一个
缺点
,
下游消息接收方无法控制到达自己的流量,如果调用方不限速,很有可能把下游压垮
。
举个
栗子
,
秒杀业务
:
上游:
发起下单操作。
下游:
完成秒杀业务逻辑(库存检查,库存冻结,余额检查,余额冻结,订单生成,余额扣减,库存扣减,生成流水,余额解冻,库存解冻)。
上游下单业务简单,每秒发起了10000个请求,下游秒杀业务复杂,每秒只能处理2000个请求,很有可能上游不限速的下单,导致下游系统被压垮,引发雪崩。
如何避免下游被压垮呢?
为了避免雪崩,
常见的优化方案
有两种:
(1)业务
上游队列缓冲,限速发送;
(2)业务
下游队列缓冲,限速执行;
不管哪种方案,
都会引入业务的复杂性
,有“缓冲流量”需求的系统都需要加入类似的机制,正所谓“
通用痛点统一解决
”,需要一个通用的机制解决这个问题。
能否通过MQ实现缓冲流量?
可以,但需要简单修改。
MQ要怎么改,能缓冲流量?
由MQ-server推模式,升级为
MQ-client拉模式
。
MQ-client根据自己的处理能力,
每隔一定时间
,或者
每次拉取若干条消息
,实施
流控
,达到
保护自身
的效果。并且这是MQ提供的通用功能,无需上下游修改代码。
如果上游发送流量过大,MQ提供拉模式确实可以起到下游自我保护的作用,会不会导致消息在MQ中堆积?
下游MQ-client拉取消息,消息接收方能够批量获取消息,需要
下游消息接收方进行优化,方能够提升整体吞吐量
,例如:批量写。
结论
(1)MQ-client提供
拉模式
,定时或者批量拉取,可以起到削平流量,下游自我保护的作用(MQ需要做的);
(2)要想提升整体吞吐量,需要下游优化,例如批量处理等方式(消息接收方需要做的);
架构优化要整体考虑,需要
通用服务
和
业务方
一起优化升级。
真人出镜,欢迎
关注+点赞
预览时标签不可点
阅读原文
微信扫一扫
关注该公众号
继续滑动看下一个
轻触阅读原文
架构师之路
向上滑动看下一个
知道了
微信扫一扫
使用小程序
取消
允许
取消
允许
×
分析
微信扫一扫可打开此内容,
使用完整服务
:
,
,
,
,
,
,
,
,
,
,
,
,
。
视频
小程序
赞
,轻点两下取消赞
在看
,轻点两下取消在看
分享
留言
收藏
听过