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