32

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

 5 years ago
source link: https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ%3D%3D&%3Bmid=2651960021&%3Bidx=1&%3Bsn=4bbe275c249a70ab20e36959fc01d4e0&%3Bchksm=bd2d07098a5a8e1fd9b505778b551002ab59c35953fa3deaaddc79e3f21bcea5ff48076
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

问:为什么会有本文?

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

问:站点与服务,服务与服务上下游之间,一般如何通讯?

答:有两种常见的方式

一种是“ 直接调用 ”,通过 RPC 框架,上游直接调用下游。

ZniU3iA.png!web

在某些业务场景之下(具体哪些业务场景,见《 到底什么时候该使用MQ? 》),可以采用“ MQ 推送 ”,上游将消息发给 MQ MQ 将消息推送给下游。

问:为什么会有流量冲击?

答:不管采用 直接调用 还是 MQ 推送 ,都有一个 缺点下游消息接收方无法控制到达自己的流量,如果调用方不限速,很有可能把下游压垮

举个 栗子 秒杀业务

上游 发起下单操作

下游 完成秒杀业务逻辑(库存检查,库存冻结,余额检查,余额冻结,订单生成,余额扣减,库存扣减,生成流水,余额解冻,库存解冻)

上游下单业务简单,每秒发起了 10000 个请求,下游秒杀业务复杂,每秒只能处理 2000 个请求,很有可能上游不限速的下单,导致下游系统被压垮,引发雪崩。

为了避免雪崩, 常见的优化方案 有两种:

1 )业务 上游队列缓冲,限速发送

2 )业务 下游队列缓冲,限速执行

不管哪种方案,都会引入业务的复杂性,有“缓冲流量”需求的系统都需要加入类似的机制(具体怎么保证消息可达,见《 消息总线能否实现消息必达? 》),正所谓“ 通用痛点统一解决 ”,需要一个通用的机制解决这个问题。

问:如何缓冲流量?

答:明明中间有了 MQ ,并且 MQ 有消息落地的机制,为何不能 利用 MQ 来做缓冲 呢?显然是可以的。

问: MQ 怎么改能缓冲流量?

答:由 MQ-server 推模式,升级为 MQ-client 拉模式

Jri6B3j.png!web

MQ-client 根据自己的处理能力, 每隔一定时间 ,或者 每次拉取若干条消息 ,实施 流控 ,达到 保护自身 的效果。并且这是 MQ 提供的通用功能,无需上下游修改代码。

问:如果上游发送流量过大, MQ 提供拉模式确实可以起到下游自我保护的作用,会不会导致消息在 MQ 中堆积?

答:下游 MQ-client 拉取消息,消息接收方能够批量获取消息,需要 下游消息接收方进行优化,方能够提升整体吞吐量 ,例如:批量写。

结论

1 MQ-client 提供 拉模式 ,定时或者批量拉取,可以起到削平流量,下游自我保护的作用( MQ 需要做的)

2 )要想提升整体吞吐量,需要下游优化,例如批量处理等方式(消息接收方需要做的)

58到家架构优化具备 整体性 ,需要 通用服务业务方 一起优化升级。

==【完】==

相关阅读:

到底什么时候使用MQ

MQ 如何实现延时消息

MQ 如何实现消息必达

MQ 如何实现幂等性


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK