反向代理的主要作用是分發(fā)請求。
首先我們要了解系統(tǒng)的性能瓶頸在哪里,一般來說網(wǎng)絡(luò)io速度和內(nèi)存io接近,都遠(yuǎn)高于磁盤io。假定一個接口請求返回數(shù)據(jù)100k(一般沒有這么大,只是假定一個方便計算的值),10個并發(fā)請求就是1M,那么全雙工千兆網(wǎng)卡(現(xiàn)在還有萬兆網(wǎng)卡,但成本太高,應(yīng)用還不廣),可以支撐并發(fā)10000個請求,開雙網(wǎng)卡,理論的上限就是20000個并發(fā)請求。
假設(shè)我們收到請求馬上就返回,那么最高并發(fā)數(shù)就是我們上面計算的結(jié)果,但是,問題在于,應(yīng)用香港服務(wù)器做不到馬上返回,因為它有很多業(yè)務(wù)邏輯需要執(zhí)行處理,比如給用戶發(fā)推送發(fā)短信發(fā)郵件,本地磁盤寫日志,請求數(shù)據(jù)庫增刪改查,調(diào)用微信的登錄接口等等等等,都附加了各個層面的io。
所以第一層的優(yōu)化,我們會盡量優(yōu)化應(yīng)用服務(wù)自身,把發(fā)推送發(fā)短信發(fā)郵件的活推到隊列,讓別的香港服務(wù)器去干。這個一般用內(nèi)存隊列,io很高。
開多線程或者協(xié)程的方式異步寫日志,但再怎么優(yōu)化,磁盤io的上限突破不了,這個io很低。還有更激進的方案,干脆日志也寫內(nèi)存,或者通過內(nèi)網(wǎng)網(wǎng)絡(luò)同步到別的香港服務(wù)器上,可以更優(yōu)化。
數(shù)據(jù)庫復(fù)用連接池,減少連接和斷開的時間開銷。查詢語句盡量優(yōu)化,減少等待數(shù)據(jù)庫操作的時間。當(dāng)然,再怎么優(yōu)化,一樣有個上限。
調(diào)用微信的登錄接口等外部接口,這個就更難辦了,受制于人,除了tcp連接池復(fù)用能稍微優(yōu)化一點點,完全是取決于外部條件。
木桶理論取最短板,所有這些條件里,總有最慢最落后的那個。假如拖后腿的這個,最佳狀態(tài)也只能優(yōu)化到支持2000個并發(fā),那就尷尬了,本來能支持20000個請求的系統(tǒng),只能用到1/10性能。
( 當(dāng)然也可以在dns對應(yīng)不同ip方式分布請求,但是dns層面的分布更復(fù)雜更麻煩,因為dns緩存的原因,請求也不能均勻分布,而且ip地址也是越來越稀缺的資源,沒有背景沒有后臺的,搞這么多ip也不容易啊 )
單個公網(wǎng)ip算一個節(jié)點的話,這個節(jié)點本來的潛力是響應(yīng)20000個并發(fā)請求,實際在應(yīng)用層面只能到2000并發(fā),潛力還未發(fā)掘啊。這個時候,就是反向代理起到用武之地的時候了。
首先一個反向代理的香港服務(wù)器拋開所有業(yè)務(wù)層的東西,只單純的接下請求再返回,那么可以支持到20000并發(fā)了。接下來應(yīng)用層面誰來處理?找來10個小弟,轉(zhuǎn)發(fā)給他們,每人2000正好。這樣這個節(jié)點系統(tǒng)雖然性價比只有10/11,但是性能潛力好歹挖盡了。
這就是反向代理的作用了。