對于突然到來的大量請求,您可以配置流控規(guī)則,以穩(wěn)定的速度逐步處理這些請求,起到“削峰填谷”的效果,從而避免流量突刺造成系統(tǒng)負(fù)載過高。
場景
請求的到來,往往是沒有規(guī)律的。
例如,某應(yīng)用的處理能力是每秒 10 個請求。在某一秒,突然到來了 30 個請求,而接下來兩秒,都沒有請求到達(dá)。在這種情況下,如果直接拒絕 20 個請求,應(yīng)用在接下來的兩秒就會空閑。所以,需要把請求突刺均攤到一段時間內(nèi),讓系統(tǒng)負(fù)載保持在請求處理水位之內(nèi),同時盡可能地處理更多請求,從而起到“削峰填谷”的效果。

上圖中,紅色的部分代表超出消息處理能力的部分。觀察得出,消息突刺往往都是瞬時的、不規(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)化,例如批量處理等方式(消息接收方需要做的)