高併發伺服器邏輯處理瓶頸,如何解決?

2021-09-13 08:29:20 字數 2123 閱讀 2989

高併發伺服器邏輯處理瓶頸,如何解決?首先我們先了解什麼是併發!

併發,在作業系統中,是指乙個時間段中有幾個程式都處於已啟動執行到執行完畢之間,且這幾個程式都是在同乙個處理機上執行,但任乙個時刻點上只有乙個程式在處理機上執行。———**《百科》

顧名思義,高併發就是在指定時間內,系統同時能夠處理大量的請求(連線數)。那麼如何衡量高併發呢?高併發衡量指標

吞吐量:單位時間內處理的請求數量;

qps(tps):每秒可以處理的請求數或事務數;

併發使用者數:同時承載正常使用系統功能的使用者數量,即多少人同時使用,系統還能正常執行的使用者數量;

根據上面衡量指標可以看到,提高併發能力必須解決如下幾個問題:

如何提高併發連線數?

那麼多的連線數怎麼進行業務處理?

應用伺服器的處理水平又該怎麼提高?

如何使用微服務架構提公升高併發邏輯?

別著急,這麼多問題我們乙個乙個來分析解決!

如下圖所示,常規的單一網路連線模型只能1個連線對應1個執行緒,壓力都集中在記憶體,導致記憶體開銷非常大,肯定支撐的連線數有限!(直接掛掉)

單一網路連線模型

有道是業務寫的再好不如一台高效能伺服器,這個鍋不一定要開發人員背的哦!!!伺服器的連線入口就那麼大(比如tomcat只有幾千的連線數),那麼處理的能力也只侷限於幾千。

怎麼解決呢?選用合適的網路io模型或者selector,通過使用乙個執行緒輪詢或者事件觸發的方式,能支援幾萬甚至更多的連線數,再配合上nginx做負載就更完美了。

大家都知道nginx只是具有反向**和負載均衡的功能,並不能處理具體的業務邏輯,不能擔當應用伺服器來使用。例如websphere 、tomcat和jetty等,但是我們可以利用nginx將接受到的大量連線通過均衡的方式(輪詢,權重,hash)分配到不同的應用伺服器中進行業務處理!

nginx負載

要提高應用伺服器的處理水平就要了解自己的應用伺服器的瓶頸在**,一般有兩個:

資料庫本身:建立有效索引、讀寫分離、雙主互備、分庫分表(sharding-jdbc等實現)等策略,提高資料庫處理能力,減少壓力!

結合記憶體資料庫:例如redid、memcached等,根據業務需要快取一些資料字典、列舉變數和頻繁使用資料等減少資料庫訪問次數,提公升資料庫處理能力。

web集群架構圖

如上圖web集群架構圖所示:

組成了經典的web高併發集群架構。

**中的業務邏輯:

開發中可以採用前後端分離的架構模式,動靜分離、松耦合等提公升前後端處理能力。

先看一下非常火的這張微服務架構圖:

微服務架構圖

主要包含11大核心元件,分別是:

核心支撐元件

資料匯流排kafka

出來上述幾點解決高併發伺服器邏輯處理瓶頸外,還要考慮網路因素,例如採用cdn加速,將不同地點的請求分發到不同的服務集群上,避免網路對速度的影響!

總之,根據自身實際業務在合理範圍內盡可能的拆分,拆分以後同類服務可以通過水平擴充套件達到整體的高效能高併發,同時將越脆弱的資源放置在鏈路的越末端,訪問的時候盡量將訪問鏈結縮短,降低每次訪問的資源消耗。服務之間直接restful模型使用http呼叫,或者redis,kafka類的訊息中介軟體通訊。單個服務直接使用nginx做負載集群,同時前後端分離,資料庫分庫分表等一整套分布式服務系統!

前後端分離

如何提高伺服器併發處理能力

以下內容為入門級介紹,意在對老技術作較全的總結而不是較深的研究。主要參考 構建高效能web站點 一書。一台伺服器在單位時間裡能處理的請求越多,伺服器的能力越高,也就是伺服器併發處理能力越強 吞吐率,單位時間裡伺服器處理的最大請求數,單位req s 從伺服器角度,實際併發使用者數的可以理解為伺服器當前...

高併發伺服器的設計 架構與瓶頸的設計GOOD

做架構設計,難免有時候被人問及系統的瓶頸在哪,那首先來了解下什麼是瓶頸?打個形象的比方,人的嘴巴可以吞下一整個麵包,但是卻嚥不下去,因為食管不給力,它比較細,所以嘴巴能吞下的食物大小要受到食管的粗細限制。城市內部每天會產生幾十萬件跨城快遞,可是跨城的交通不給力,只允許走小型卡車,一卡車一次就能裝幾千...

Epoll實現伺服器高併發

最近在做乙個關於高併發伺服器相關的專案需要用到非同步 非阻塞io通訊,實現高tcp併發。以下用epoll技術實現乙個簡單的tcp高併發伺服器,驗證無業務處理的情況下,epoll處理併發連線的數的效果。include include include include include include in...