對于突然到來的大量請求抛丽,您可以配置流控規(guī)則,以穩(wěn)定的速度逐步處理這些請求晌缘,起到“削峰填谷”的效果,從而避免流量突刺造成系統(tǒng)負載過高痢站。
場景
請求的到來磷箕,往往是沒有規(guī)律的。
例如阵难,某應用的處理能力是每秒 10 個請求岳枷。在某一秒,突然到來了 30 個請求呜叫,而接下來兩秒空繁,都沒有請求到達。在這種情況下朱庆,如果直接拒絕 20 個請求盛泡,應用在接下來的兩秒就會空閑。所以娱颊,需要把請求突刺均攤到一段時間內(nèi)傲诵,讓系統(tǒng)負載保持在請求處理水位之內(nèi),同時盡可能地處理更多請求箱硕,從而起到“削峰填谷”的效果拴竹。
上圖中,紅色的部分代表超出消息處理能力的部分剧罩。觀察得出栓拜,消息突刺往往都是瞬時的、不規(guī)律的惠昔,其后一段時間系統(tǒng)往往都會有空閑資源幕与。把紅色的那部分消息平攤到后面空閑時去處理,這樣既可以保證系統(tǒng)負載處在一個穩(wěn)定的水位舰罚,又可以盡可能地處理更多消息纽门。通過配置流控規(guī)則,可以達到消息勻速處理的效果营罢。
分析問答
1. 問:站點與服務赏陵,服務與服務上下游之間饼齿,一般如何通訊?
答:有兩種常見的方式
一種是“直接調(diào)用”蝙搔,通過RPC框架缕溉,上游直接調(diào)用下游:
還有一種,在某些業(yè)務場景之下吃型,可以采用“MQ推送”证鸥,上游將消息發(fā)給MQ,MQ將消息推送給下游勤晚。
2. 問:以上兩種為什么為有流量沖擊枉层?
答:不管采用“直接調(diào)用” 還是 “MQ推送”,都有一個很大的缺點赐写,下游消息接收方無法控制到達自己的流量鸟蜡,如果調(diào)用方不斷的調(diào)用且不限速,很有可能把下游服務壓垮挺邀。
- 舉個例子: 秒殺業(yè)務
上游發(fā)起高并發(fā)的下單請求揉忘。
下游完成秒殺業(yè)務邏輯(庫存檢查 - 庫存凍結(jié) - 余額檢查 - 余額凍結(jié) - 訂單完成 - 余額扣減 - 庫存扣減 - 生成流水 - 余額解凍 - 庫存解凍)。
上游下單業(yè)務簡單端铛,每秒發(fā)起10000+個請求泣矛,下游秒殺業(yè)務復雜,每秒只能處理2000+個請求禾蚕,很有可能上游不限速的下單您朽,導致下游系統(tǒng)被壓垮,引起雪崩夕膀。
3. 問:MQ怎么改能緩沖流量虚倒?
答:由MQ-server 推(push)模式,改為 MQ-client(pull)為拉模式
MQ-client根據(jù)自己的處理能力产舞,每隔一定時間魂奥,或者每次拉取若干條消息,實施流控易猫,達到保護自身的效果耻煤。并且這是MQ提供的通用功能,無需上下游修改代碼准颓。
4. 問:如果上游發(fā)送流量過大哈蝇,MQ提供拉模式確實可以起到下游自我保護的作用,會不會導致消息在MQ中堆積攘已?
答:下游MQ-client拉取消息炮赦,消息接收方能夠批量獲取消息,需要下游消息接收方進行優(yōu)化样勃,方能夠提升整體吞吐量吠勘,例如:批量寫性芬。
結(jié)論
- MQ-client提供拉模式,定時或者批量拉取剧防,可以起到削平流量植锉,下游自我保護的作用(MQ需要做的)
- 要想提升整體吞吐量,需要下游優(yōu)化峭拘,例如批量處理等方式(消息接收方需要做的)