MQ實(shí)戰(zhàn)-削峰填谷

對于突然到來的大量請求,您可以配置流控規(guī)則,以穩(wěn)定的速度逐步處理這些請求,起到“削峰填谷”的效果,從而避免流量突刺造成系統(tǒng)負(fù)載過高。

場景

請求的到來,往往是沒有規(guī)律的。

例如,某應(yīng)用的處理能力是每秒 10 個請求。在某一秒,突然到來了 30 個請求,而接下來兩秒,都沒有請求到達(dá)。在這種情況下,如果直接拒絕 20 個請求,應(yīng)用在接下來的兩秒就會空閑。所以,需要把請求突刺均攤到一段時間內(nèi),讓系統(tǒng)負(fù)載保持在請求處理水位之內(nèi),同時盡可能地處理更多請求,從而起到“削峰填谷”的效果。

image.png

上圖中,紅色的部分代表超出消息處理能力的部分。觀察得出,消息突刺往往都是瞬時的、不規(guī)律的,其后一段時間系統(tǒng)往往都會有空閑資源。把紅色的那部分消息平攤到后面空閑時去處理,這樣既可以保證系統(tǒng)負(fù)載處在一個穩(wěn)定的水位,又可以盡可能地處理更多消息。通過配置流控規(guī)則,可以達(dá)到消息勻速處理的效果。

分析問答

1. 問:站點(diǎn)與服務(wù),服務(wù)與服務(wù)上下游之間,一般如何通訊?

答:有兩種常見的方式
一種是“直接調(diào)用”,通過RPC框架,上游直接調(diào)用下游:


還有一種,在某些業(yè)務(wù)場景之下,可以采用“MQ推送”,上游將消息發(fā)給MQ,MQ將消息推送給下游。


2. 問:以上兩種為什么為有流量沖擊?

答:不管采用“直接調(diào)用” 還是 “MQ推送”,都有一個很大的缺點(diǎn),下游消息接收方無法控制到達(dá)自己的流量,如果調(diào)用方不斷的調(diào)用且不限速,很有可能把下游服務(wù)壓垮。

  • 舉個例子: 秒殺業(yè)務(wù)
    上游發(fā)起高并發(fā)的下單請求。
    下游完成秒殺業(yè)務(wù)邏輯(庫存檢查 - 庫存凍結(jié) - 余額檢查 - 余額凍結(jié) - 訂單完成 - 余額扣減 - 庫存扣減 - 生成流水 - 余額解凍 - 庫存解凍)。
    上游下單業(yè)務(wù)簡單,每秒發(fā)起10000+個請求,下游秒殺業(yè)務(wù)復(fù)雜,每秒只能處理2000+個請求,很有可能上游不限速的下單,導(dǎo)致下游系統(tǒng)被壓垮,引起雪崩。

3. 問:MQ怎么改能緩沖流量?
答:由MQ-server 推(push)模式,改為 MQ-client(pull)為拉模式

MQ-client根據(jù)自己的處理能力,每隔一定時間,或者每次拉取若干條消息,實(shí)施流控,達(dá)到保護(hù)自身的效果。并且這是MQ提供的通用功能,無需上下游修改代碼。

4. 問:如果上游發(fā)送流量過大,MQ提供拉模式確實(shí)可以起到下游自我保護(hù)的作用,會不會導(dǎo)致消息在MQ中堆積?
答:下游MQ-client拉取消息,消息接收方能夠批量獲取消息,需要下游消息接收方進(jìn)行優(yōu)化,方能夠提升整體吞吐量,例如:批量寫。

結(jié)論

  • MQ-client提供拉模式,定時或者批量拉取,可以起到削平流量,下游自我保護(hù)的作用(MQ需要做的)
  • 要想提升整體吞吐量,需要下游優(yōu)化,例如批量處理等方式(消息接收方需要做的)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容