天天看點

大型API網關(二)—— 性能

網關作為流量的入口,需要處理極大量的并發請求,對一個大型網關而言,峰值QPS往往會達到百萬級别,是以,對網關而言,性能是必須重點考慮的一個因素。

目前主流的服務架構,一般都是在配置比較高的硬體伺服器上劃分出很多容器,根據請求量的大小,進行橫向擴容/縮容。

一個粗略的網關系統的架構,大緻是下面這個樣子的:

大型API網關(二)—— 性能

這一篇,隻講API網關這一層的性能。

硬體本身的性能是一定的,因為硬體本身的資源是一定的,這裡和資源相關的性能是指機器的性能,比如磁盤每秒能轉多少圈,CPU每秒能進行多少次運算,網卡每秒能傳輸多少資料,等等。

這一層的性能不是我們要讨論的,我們服務端開發人員也無能為力,這一層的性能隻能靠搞硬體的大神們了。不過,摩爾定律差不多已經失效的今天,除了量子計算之外,傳統的計算機硬體性能可提升的空間應該已經極其極其有限了。

我們回到軟體的性能上來,理論上,我們談到軟體性能時,基本上就是指在有限的硬體資源下,在保證服務的響應時間(後續用rt代替)在一定範圍内時,每秒可以處理的請求數(後續用qps代替)。請求數越大,性能就越好,或者對于API網關來說,用另一個詞更合适一些:吞吐量。

舉個例子,一個請求的rt是10ms,同樣配置的機器,網關A可以保證qps=100時,rt=10ms不變,另一個網關B,可以保證qps=1000時,rt=10ms不變,我們說網關B的性能更好,其實是網關B的吞吐量更高。

對于服務響應時間,補充一點,服務響應的rt = 網關層的耗時 + 下遊服務的耗時。我們假設下遊服務的耗時是一直穩定的,至于怎樣保證下遊讀物耗時一直穩定,那是下遊的事情,這裡我們隻考慮網關層的耗時。

是以,應該怎樣提升網關的性能(吞吐量)呢?

等等,在回答這個問題之前,還有一個更重要的問題,為啥要提高網關的性能?

因為要節約成本啊,10台機器可以搞定的事情,如果現在用1台就能搞定,那肯定能省很多錢。或者,更高尚一些,能為這個星球節省一些資源,畢竟,程式員們都是心懷宇宙的。

好,回到剛才的問題,怎樣提升網關的性能呢?

答:性能和耗時是成反比的,是以,提升性能=縮短耗時。

網關的耗時基本由3部分組成:

  1. 等待請求的資料傳過來
  2. 等下遊服務響應
  3. 網關本身的資料處理

1和2,顯然沒辦法,這是網絡傳輸和下遊服務的事。

至于第3點,資料就那麼多,算法也擺在那,貌似也沒辦法縮短時間。并發很低的情況下,确實是這樣的,但是,并發很高的場景下,比如網關系統,情況就發生了變化。這個變化很重要,具體變化是:比如我們的機器時4核的,當并發是4的時候,每個核處理一個請求,剛剛好,耗時就是上面的1+2+3.但是當并發很大,比如4000的時候,就會冒出來第4個耗時:線程切換的耗時。

線程切換是怎麼回事?不解釋,網上一搜一大把。

線程切換為什麼會耗時?同上。

怎麼縮短線程切換的耗時?切換的少了就耗時少了。

怎麼降低線程切換頻率?少建立一些線程就行了。

可是并發那麼多,線程少了怎麼處理的過來?IO多路複用

IO多路複用是什麼?不解釋,網上一搜一大把。

最後,我一直認為,但凡性能問題,說到底都是軟體(使用硬體的方式)問題和硬體問題(計算速度)。

軟體不好,是我等程式員的責任。

硬體不好,是實體規律的限制。

繼續閱讀