問(wèn):為什么會(huì)有本文?答:上一篇文章《
到底什么時(shí)候該使用MQ?》引起了廣泛的討論,有朋友回復(fù)說(shuō),MQ的還有一個(gè)
典型應(yīng)用場(chǎng)景是
緩沖流量,削峰填谷,本文將簡(jiǎn)單介紹下,MQ要實(shí)現(xiàn)什么細(xì)節(jié),才能緩沖流量,削峰填谷。
問(wèn):站點(diǎn)與服務(wù),服務(wù)與服務(wù)上下游之間,一般如何通訊?答:有兩種常見(jiàn)的方式
一種是“
直接調(diào)用”,通過(guò)RPC框架,上游直接調(diào)用下游。
在某些業(yè)務(wù)場(chǎng)景之下(具體哪些業(yè)務(wù)場(chǎng)景,見(jiàn)《
到底什么時(shí)候該使用MQ?》),可以采用“
MQ推送”,上游將消息發(fā)給MQ,MQ將消息推送給下游。
問(wèn):為什么會(huì)有流量沖擊?答:不管采用“直接調(diào)用”還是“MQ推送”,都有一個(gè)
缺點(diǎn),
下游消息接收方無(wú)法控制到達(dá)自己的流量,如果調(diào)用方不限速,很有可能把下游壓垮。
舉個(gè)
栗子,
秒殺業(yè)務(wù):
上游發(fā)起下單操作
下游完成秒殺業(yè)務(wù)邏輯(庫(kù)存檢查,庫(kù)存凍結(jié),余額檢查,余額凍結(jié),訂單生成,余額扣減,庫(kù)存扣減,生成流水,余額解凍,庫(kù)存解凍)
上游下單業(yè)務(wù)簡(jiǎn)單,每秒發(fā)起了10000個(gè)請(qǐng)求,下游秒殺業(yè)務(wù)復(fù)雜,每秒只能處理2000個(gè)請(qǐng)求,很有可能上游不限速的下單,導(dǎo)致下游系統(tǒng)被壓垮,引發(fā)雪崩。
為了避免雪崩,
常見(jiàn)的優(yōu)化方案有兩種:
1)業(yè)務(wù)
上游隊(duì)列緩沖,限速發(fā)送2)業(yè)務(wù)
下游隊(duì)列緩沖,限速執(zhí)行不管哪種方案,都會(huì)引入業(yè)務(wù)的復(fù)雜性,有“緩沖流量”需求的系統(tǒng)都需要加入類(lèi)似的機(jī)制(具體怎么保證消息可達(dá),見(jiàn)《
消息總線能否實(shí)現(xiàn)消息必達(dá)?》),正所謂“
通用痛點(diǎn)統(tǒng)一解決”,需要一個(gè)通用的機(jī)制解決這個(gè)問(wèn)題。
問(wèn):如何緩沖流量?答:明明中間有了MQ,并且MQ有消息落地的機(jī)制,為何不能
利用MQ來(lái)做緩沖呢?顯然是可以的。
問(wèn):MQ怎么改能緩沖流量?答:由MQ-server推模式,升級(jí)為
MQ-client拉模式。
MQ-client根據(jù)自己的處理能力,
每隔一定時(shí)間,或者
每次拉取若干條消息,實(shí)施
流控,達(dá)到
保護(hù)自身的效果。并且這是MQ提供的通用功能,無(wú)需上下游修改代碼。
問(wèn):如果上游發(fā)送流量過(guò)大,MQ提供拉模式確實(shí)可以起到下游自我保護(hù)的作用,會(huì)不會(huì)導(dǎo)致消息在MQ中堆積?答:下游MQ-client拉取消息,消息接收方能夠批量獲取消息,需要
下游消息接收方進(jìn)行優(yōu)化,方能夠提升整體吞吐量,例如:批量寫(xiě)。
結(jié)論1)MQ-client提供
拉模式,定時(shí)或者批量拉取,可以起到削平流量,下游自我保護(hù)的作用(MQ需要做的)
2)要想提升整體吞吐量,需要下游優(yōu)化,例如批量處理等方式(消息接收方需要做的)
58到家架構(gòu)優(yōu)化具備
整體性,需要
通用服務(wù)和
業(yè)務(wù)方一起優(yōu)化升級(jí)。
更多建議: