58 到家 MQ 如何快速實現流量削峰填谷
問:為什麼會有本文?
答:上一篇文章《 ofollow,noindex">到底什麼時候該使用MQ? 》引起了廣泛的討論,有朋友回覆說, MQ 的還有一個 典型應用場景 是 緩衝流量,削峰填谷 ,本文將簡單介紹下, MQ 要實現什麼細節,才能緩衝流量 ,削峰填谷 。
問:站點與服務,服務與服務上下游之間,一般如何通訊?
答:有兩種常見的方式
一種是“ 直接呼叫 ”,通過 RPC 框架,上游直接呼叫下游。
在某些業務場景之下(具體哪些業務場景,見《 到底什麼時候該使用MQ? 》),可以採用“ MQ 推送 ”,上游將訊息發給 MQ , MQ 將訊息推送給下游。
問:為什麼會有流量衝擊?
答:不管採用 “ 直接呼叫 ” 還是 “ MQ 推送 ” ,都有一個 缺點 , 下游訊息接收方無法控制到達自己的流量,如果呼叫方不限速,很有可能把下游壓垮 。
舉個 栗子 , 秒殺業務 :
上游 發起下單操作
下游 完成秒殺業務邏輯(庫存檢查,庫存凍結,餘額檢查,餘額凍結,訂單生成,餘額扣減,庫存扣減,生成流水,餘額解凍,庫存解凍)
上游下單業務簡單,每秒發起了 10000 個請求,下游秒殺業務複雜,每秒只能處理 2000 個請求,很有可能上游不限速的下單,導致下游系統被壓垮,引發雪崩。
為了避免雪崩, 常見的優化方案 有兩種:
1 )業務 上游佇列緩衝,限速傳送
2 )業務 下游佇列緩衝,限速執行
不管哪種方案,都會引入業務的複雜性,有“緩衝流量”需求的系統都需要加入類似的機制(具體怎麼保證訊息可達,見《 訊息匯流排能否實現訊息必達? 》),正所謂“ 通用痛點統一解決 ”,需要一個通用的機制解決這個問題。
問:如何緩衝流量?
答:明明中間有了 MQ ,並且 MQ 有訊息落地的機制,為何不能 利用 MQ 來做緩衝 呢?顯然是可以的。
問: MQ 怎麼改能緩衝流量?
答:由 MQ-server 推模式,升級為 MQ-client 拉模式 。
MQ-client 根據自己的處理能力, 每隔一定時間 ,或者 每次拉取若干條訊息 ,實施 流控 ,達到 保護自身 的效果。並且這是 MQ 提供的通用功能,無需上下游修改程式碼。
問:如果上游傳送流量過大, MQ 提供拉模式確實可以起到下游自我保護的作用,會不會導致訊息在 MQ 中堆積?
答:下游 MQ-client 拉取訊息,訊息接收方能夠批量獲取訊息,需要 下游訊息接收方進行優化,方能夠提升整體吞吐量 ,例如:批量寫。
結論
1 ) MQ-client 提供 拉模式 ,定時或者批量拉取,可以起到削平流量,下游自我保護的作用( MQ 需要做的)
2 )要想提升整體吞吐量,需要下游優化,例如批量處理等方式(訊息接收方需要做的)
58到家架構優化具備 整體性 ,需要 通用服務 和 業務方 一起優化升級。
==【完】==
相關閱讀:
《 到底什麼時候使用MQ 》
《 MQ 如何實現延時訊息 》
《 MQ 如何實現訊息必達 》
《 MQ 如何實現冪等性 》