DBLE 網絡模塊源碼解析之網絡 IO 基礎知識-愛可生

2020-12-22 愛可生雲資料庫

前言

對於計算機學科來說,計算機網絡相關知識的重要性不言而喻。平時我們框架用的多了,對於底層網絡 IO 的處理關注的並不算多(如果不讓你用 Spring,你還能寫出個 Web 接口嗎?),但對於中間件以及框架的開發者來說,網絡 IO 的處理卻是最需要關注的地方。

DBLE 的網絡模塊沒有用任何框架,完全是通過原生 JDK 純手寫的。研讀 DBLE 網絡模塊的源碼,能夠讓你對網絡 IO 的處理有更進一步的理解。為什麼連接 DBLE 能夠像連接 MySQL 一樣?為什麼 DBLE 的性能能夠如此高?希望通過本系列文章,能夠幫助大家對DBLE的網絡模塊有更深入的了解,更進一步,希望能夠幫助大家對高性能網絡 IO 有更深入的了解。

本篇作為 《DBLE 網絡模塊源碼解析》的第一篇,主要講講網絡 IO 的基礎知識。

一、TCP/IP 協議棧

TCP/IP 協議在一定程度上參考了 OSI 的體系結構。OSI 模型共有七層,從下到上分別是物理層、數據鏈路層、網絡層、運輸層、會話層、表示層和應用層。但是這顯然是有些複雜的,所以在 TCP/IP 協議中,它們被簡化為了四個層次,從下到上依次是鏈路層、網絡層、傳輸層和應用層。

不同層之間的數據封裝如下圖所示:

TCP/IP 協議棧不同層之間的數據封裝

從上圖可以看出上一層的協議數據都是作為下一層協議的消息體來傳輸的。所以協議從上到下,是一層一層封裝的結構。

二、MySQL 協議

MySQL 協議在 TCP/IP 協議棧中是處於應用層這一層。從而能夠知道 MySQL 協議數據是作為 TCP 協議中的消息體部分來傳輸的。

因為 TCP 為面向流的協議,沒有界限,會存在粘包拆包問題,需要在應用層解決。常見的解決方法有:

1. 消息定長,例如每個報文的大小為固定長度 100 字節,如果不夠,空位補空格;

2. 在包尾增加回車換行符進行分割,例如 FTP 協議;

3. 將消息分為消息頭和消息體,消息頭中包含表示消息總長度(或者消息體長度)的欄位;

4. 更複雜的應用層協議。

MySQL 協議是通過消息定長和在消息頭中包含消息體長度欄位的方法來解決 TCP 粘包問題的。如下圖所示:

MySQL協議

連接 DBLE 既然能像連接 MySQL 一樣,那 DBLE 一定要能夠處理 MySQL 的數據包,如何處理這些數據包在代碼裡都有體現,我將在網絡模塊源碼解析裡詳細講解 DBLE 對於 MySQL 數據包的處理。

三、BIO 與 NIO

DBLE 性能能夠如此之高,與它的高性能網絡 IO 處理離不開關係。DBLE 中處理前端客戶端連接及後端 MySQL 資料庫連接都使用了 NIO 的方式,即 IO 多路復用技術

在網絡連接數較少的情況下通過 BIO+ 多線程的方式也能夠比較快速的處理請求,但隨著連接數的增多,線程間的切換帶來的性能損耗將大於多線程處理帶來的性能提升,從而導致整體性能下降。

而 NIO 即 IO 多路復用技術,能夠通過少量線程管理更多的連接。NIO 不會為每個連接創建一個處理線程,而只是在連接有數據的時候進行處理。NIO 再加上請求數據處理異步化,是 DBLE 高性能的秘密。

下期預告

本篇文章為 DBLE 網絡模塊源碼解析的第一篇,主要介紹了關於網絡 IO 的一些基礎知識。包括 TCP/IP 協議棧、應用層 MySQL 協議、BIO 和 NIO 相關知識,為後面的源碼解析做個鋪墊,下一篇將從源碼角度詳細講解 DBLE 的網絡處理邏輯,希望能夠對大家有所幫助。

相關焦點

  • 分布式資料庫使用 Arthas 熱更新 dble-愛可生
    在進行小版本升級時,需要控制 dble 的版本號,因此每次熱更新時需要替換 Versions.class 文件維護 dble 的版本號,經測試,發現 jrebel 對靜態類的支持並不友好,實際測試沒有生效,相比較而言 arthas 則可以生效。因此下面主要對 arthas 在 dble 中的使用進行說明。
  • 詳解MySQL|MySQL中間件DBLE-第五章 後端資料庫相關特性-愛可生
    本節提綱本節內容是對後端的資料庫相關特性重點解析。後端資料庫的相關特性主要從讀寫分離、連接管理、上下文同步以及高可用故障切換四個方面拆分講解;讀寫分離與高可用故障切換是社區同學反饋中需求最大的部分,本節內容十分詳盡的講解了大家關注的關鍵技術點及相關處理細節,有助於增進對分布式應用的相關理解。
  • 分布式Jump Consistent Hash原理-愛可生
    前言之前愛可生開源社區公眾號發表了《dble 沿用 jumpstringhash,移除 Mycat 一致性 hash 原因解析》。隨後又發表了本文上篇,初步解釋了 Jump Consistent Hash 的原理。
  • 波卡周報 | 波卡正在開發 Lottery 模塊,激勵大家參與波卡網絡的治理
    https://polkadot.polkassembly.io/post/172 Patract Labs 提交了他們對 Megaclite 的提案,為 Polkadot 生態系統的基本零知識證明提供支持。目前該支出議案已經通過。
  • 網絡模塊是什麼?網絡模塊怎麼接?
    裝修風格方面每個人都有自己的審美,小澤不多贅述,但是網絡模塊的製作,山澤是專業,多學一項本事就少說一句求人的話,自己動手豐衣足食,今天小澤就給大家介紹一下網絡模塊的構造和接線步驟,走起!網線模塊它屬於一個中間連接器,可以安裝在牆面或桌面上,它就像是房間牆上的閉路電視插口一樣。將網線插入信息模塊插座即可連網使用。
  • 如何閱讀源碼?推薦一本書
    1 意義與難點這本書最開始講了源碼閱讀的優點,作者總結了四點:透徹地理解項目的實現原理接觸到成熟和先進的架構方案學習到可靠與巧妙的實施技巧發現自身知識盲點,提升自身知識儲備然後講解了為什麼閱讀源碼十分困難,作者總結原因為每一個優秀的工程項目都凝聚了眾多開發者的縝密思維邏輯;每一個優秀的工程項目都經歷了從雛形到成熟的曲折演化過程
  • Suck.io遊戲介紹遊戲特色獨家解析
    18183首頁 Suck.io Suck.io遊戲介紹遊戲特色獨家解析 Suck.io遊戲介紹遊戲特色獨家解析 來源
  • Selenium3源碼之異常模塊篇
    Selenium3 Python3源碼分析系列以短文方式進行分享閱讀源碼是掌握Selenium的最好方式
  • 網絡爬蟲(一)基礎知識
    其實說到大數據,就不得不提大數據「繭房」,大數據雖然能夠給我們提供更多的便利,但一定程度上它也限制了我們獲取知識的寬度,像一個繭一樣,把我們包裹在自己想要了解的地方,對於「繭」外的東西一概不知。比較官方的來說,網絡爬蟲(又被稱為網頁蜘蛛,網絡機器人)是一種按照一定的規則,自動地抓取全球資訊網信息的程序或者腳本。通用網絡爬蟲從網際網路中搜集網頁,採集信息,這些網頁信息用於為搜尋引擎建立索引從而提供支持,它決定著整個引擎系統的內容是否豐富,信息是否即時,因此其性能的優劣直接影響著搜尋引擎的效果。
  • Python wsgiref 模塊源碼淺析
    Python的wisgiref模塊提供了demo_app,來演示如何使用wsgi協議。self.wfile, self.get_stderr(), self.get_environ()    )    handler.request_handler = self         handler.run(self.server.get_app())handle方法和BaseHTTPRequestHanler的handle方法所做的類似,解析驗證客戶端的
  • 網絡爬蟲(二)進階知識
    Python有簡潔輕鬆的語法,開箱即用的模塊,強大快樂的社區,總可以快速構建出簡單高效的解決方案。爬蟲涉及多個領域,內容包羅萬象,我們會介紹一些Python的模塊,比如urllib、Requests、BeautifulSoup、lxml、NLTK、Pillow等,可能還會涉及一些數據存儲和分析的內容。
  • ifanr 訪談:Pip.io,野心勃勃的社交網絡平臺
    剛上線的 Pip.io 以全新的 web app 設計理念,整合了現有的社交網絡。你可以方便的查看所有添加的更新,並將訊息同時發布到不同的社交網絡平臺。其形式類似於多帳號的客戶端,現有社交網絡的用戶可以無障礙的轉移過來,並開始使用 pip.io 的其它服務。ifanr 近日採訪了位於舊金山的 pip.io 創始人 Leo Shimizu。
  • 智匯華雲|Docker容器網絡解析
    企業IT建設開始大規模使用Docker時,你會發現需要了解很多關於網絡的知識。作為目前最火的輕量級容器技術,Docker有很多令人稱道的功能,如Docker的鏡像管理。然而,Docker的建設也會碰到一系列的挑戰,根據調查報告指出,容器的網絡和安全實現成為容器雲平臺建設最主要的挑戰,當企業開始將重要的企業核心應用遷移至容器平臺,如果缺乏足夠的網絡和安全管控將會給業務上線帶來潛在威脅。因此,我們有必要深入了解Docker的網絡知識,以滿足更高的網絡需求。
  • t-io 3.6.1 發布,被華為選中的網絡中臺
    前置說明1、代碼實質停更近兩個月和t-io,前天被告知已經入駐華為開源軟體優選庫了
  • Kubernetes 學習筆記之 ServiceAccount TokensController 源碼解析
    在 Kubernetes 學習筆記之 ServiceAccount AdmissionController 源碼解析 文章中,知道一個 ServiceAccount 對象都會引用一個type="kubernetes.io/service-account-token" 的 secret 對象,這個 secret
  • 實戰 | 源碼入門之Faster RCNN
    網上有很多版本的Faster RCNN的源碼,但是很多版本代碼太過於龐大,對新入門的學習者學習起來很不友好,在網上苦苦尋找了一番後終於找到了一個適合源碼學習的Faster Rcnn的pytorch版本代碼。根據該版本的作者講該代碼除去注釋只有兩千行左右,並且經過小編的一番學習之後,發現該版本的代碼真的是非常的精簡幹練,讀起來「朗朗上口」,並且深刻的感覺到作者代碼功底之深厚。
  • Kubernetes Informer 機制源碼解析
    這篇文章來源於雲原生社區組織的 Kubernetes 源碼研習社的作業,是個人學習Informer機制、理解Informer各個組件的設計的總結。背景為什麼Kubernetes需要Informer機制?
  • 【問答知識】東莞網絡推廣技術服務
    東莞網絡推廣技術服務網絡傳媒安裝-保養-維護-售後篇:文章教你如何對網站進行伺服器軟體維護、伺服器硬體維護、網站安全維護、內容更新、網站安全等。計算機硬體在使用中常會出現一些問題,同樣,網絡設備也同樣影響企業網站的工作效率,網絡設備屬於技術操作,非專業人員的誤操作有可能導致整個企業網站癱瘓。 沒有任何作業系統是安全的。維護作業系統的安全必須不斷的留意相關網站,及時的為系統安裝升級包或者打上補丁。
  • [Python從零到壹] 五.網絡爬蟲之BeautifulSoup基礎語法萬字詳解
    所有文章都將結合案例、代碼和作者的經驗講解,真心想把自己近十年的編程經驗分享給大家,希望對您有所幫助,文章中不足之處也請海涵。Python系列整體框架包括基礎語法10篇、網絡爬蟲30篇、可視化分析10篇、機器學習20篇、大數據分析20篇、圖像識別30篇、人工智慧40篇、Python安全20篇、其他技巧10篇。