Socket通訊探索(二)-socket集群

来源:https://www.cnblogs.com/onedayinMay/archive/2020/01/16/12203618.html
-Advertisement-
Play Games

前面我們在章節“Socket通訊探索(一)”中如何實現一個tcp連接,但是這僅僅是一個最初級的BIO實現,且沒有添加線程池,實際應用中很少採用這種方式,因為不得不考慮當大量的Tcp連接建立的時候,服務端如何安全穩定的運行?為什麼呢? 1、BIO實現方式,是阻塞式的(上一節最後面的實現方式雖然無數據的 ...


  前面我們在章節“Socket通訊探索(一)”中如何實現一個tcp連接,但是這僅僅是一個最初級的BIO實現,且沒有添加線程池,實際應用中很少採用這種方式,因為不得不考慮當大量的Tcp連接建立的時候,服務端如何安全穩定的運行?為什麼呢?

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

  2、服務端為每條連接都開闢了一個線程進行處理,而且在連接不斷開的情況下,線程不會得到釋放;

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

  大家都知道當web應用面臨大量的請求時,我們會對其進行集群或分散式等方式部署,同理,我們也可以對socket服務端進行多處部署。

  通常,由於Tcp連接中客戶端需要知道服務端的IP跟埠,那麼這就意味著客戶端需要知道所有的目標伺服器的地址和埠,如果有那麼一臺主機專門用於對我們的伺服器進行負載均衡,然後將負載均衡完成後選擇的地址跟埠返回給客戶端,然後客戶端再發起真實的連接請求。具體的請求過程如下圖(詳細請參考:https://wenku.baidu.com/view/d5769f85d4d8d15abe234e7c):

  

  以上圖中的virtual server實際上就是一個負載均衡用的伺服器,所有客戶端都會優先連接此伺服器得到真實伺服器連接(real server);該模型具體的通信流程如下:

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

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

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

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

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

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

  通過以上模型即可完成TCP服務端集群部署,至於具體的實現過程,不在本篇的範疇之內,就目前來說,我只瞭解這一種實現方式,如果還有其他的方案,大家可以相互交流……

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • vue項目中可以直接使用 1、常用工具類untils.js中 2、本地存儲工具類storageUntils.js 項目中常用到的一些工具方法,持續更新中。。。 ...
  • ReactJS簡介 + React 起源於 Facebook 的內部項目,因為該公司對市場上所有 JavaScript MVC 框架,都不滿意,就決定自己寫一套,用來架設 Instagram 的網站。做出來以後,發現這套東西很好用, 就在2013年5月開源了 。 + 由於 React 的設計思想極其 ...
  • JS 百度地圖路書 動態路線 <!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="initial-sca ...
  • 定義 在一個分散式系統(指系統中的節點互相連接並共用數據)中,當涉及讀寫操作時,只能保證一致性 (Consistency)、可用性 (Availability)、分區容錯性 (Partition Tolerance)三者中的兩個,另外一個必須被犧牲。 一致性:CAP中的C和ACID 中的C不是一個含 ...
  • 既要低頭趕路,又要抬頭望天,科技是為人服務的,任何技術背後都有更深層次的考量,在本系列的第一篇文章中我們聊了微服務的本質,它是一種可以加速分工、促進合作的新協作機制。知其然,知其所以然,在第二篇文章中我們剖析了微服務為什麼可以加速分工、促進合作,今天我們再接著來聊聊怎樣開啟微服務架構之旅。 ...
  • 二進位 0000 0000 0000 0000 0000 0000 0000 0001 // 2^0 0000 0000 0000 0000 0000 0000 0000 0010 // 2^1 0000 0000 0000 0000 0000 0000 0000 0100 // 2^2 0000 ...
  • 消息中間件 消息的可靠性傳遞 前言 消息中間件的可靠性消息傳遞,是消息中間件領域非常重要的方案落實問題(在這之前的MQ理論,MQ選型是抽象層次更高的問題,這裡不談)。 並且這個問題與日常開發是存在較大的關聯的。可以這麼說,凡是使用了MQ的,機會都要考慮這個問題。當然也有一些原始數據採集,日誌數據收集 ...
  • 一、訪問網路的兩種方法 1.get:利用參數給伺服器傳遞信息;參數為dict,然後parse解碼 2.post:一般向伺服器傳遞參數使用;post是把信息自動加密處理;如果想要使用post信息,需要使用到data參數 3.Content-Type:application/x-www.form-url ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...