Socket通信探索(二)-socket集羣

  前面咱們在章節「Socket通信探索(一)」中如何實現一個tcp鏈接,可是這僅僅是一個最初級的BIO實現,且沒有添加線程池,實際應用中不多采用這種方式,由於不得不考慮當大量的Tcp鏈接創建的時候,服務端如何安全穩定的運行?爲何呢?html

  一、BIO實現方式,是阻塞式的(上一節最後面的實現方式雖然無數據的時候,不會阻塞);web

  二、服務端爲每條鏈接都開闢了一個線程進行處理,並且在鏈接不斷開的狀況下,線程不會獲得釋放;安全

  基於以上狀況,當有大量的鏈接創建的時候,服務端會開闢大量的線程處理並得不到釋放,而線程會佔用系統資源,這樣就會致使系統資源耗盡,沒有系統資源的鏈接請求將會等待處理,更甚至程序直接崩潰,因此最直接的方式是添加線程池防止程序崩潰,大量的鏈接的處理則還還須要另想他法。服務器

  你們都知道當web應用面臨大量的請求時,咱們會對其進行集羣或分佈式等方式部署,同理,咱們也能夠對socket服務端進行多處部署。負載均衡

  一般,因爲Tcp鏈接中客戶端須要知道服務端的IP跟端口,那麼這就意味着客戶端須要知道全部的目標服務器的地址和端口,若是有那麼一臺主機專門用於對咱們的服務器進行負載均衡,而後將負載均衡完成後選擇的地址跟端口返回給客戶端,而後客戶端再發起真實的鏈接請求。具體的請求過程以下圖(詳細請參考:https://wenku.baidu.com/view/d5769f85d4d8d15abe234e7c):socket

  

  以上圖中的virtual server實際上就是一個負載均衡用的服務器,全部客戶端都會優先鏈接此服務器獲得真實服務器鏈接(real server);該模型具體的通訊流程以下:tcp

    ①client向處於偵聽的vs發SYN包;分佈式

    ②VS按照調度策略選擇一個RS,並向RS發SYN包;線程

    ④RS響應VS的SYN請求,將SYN ACK包返回給VS;server

    ④VS將收到的SYN ACK包發給client;

    ④client將5次握手的最後一個ACK包直接發給RS,此時client進入已創建鏈接狀態,RS在收到ACK包後也進入已創建鏈接狀態

    ⑥client和RS直接通訊,此過程與VS無關。

  經過以上模型便可完成TCP服務端集羣部署,至於具體的實現過程,不在本篇的範疇以內,就目前來講,我只瞭解這一種實現方式,若是還有其餘的方案,你們能夠相互交流……

相關文章
相關標籤/搜索