twemproxy代碼框架概述——剖析twemproxy代碼前編

来源:http://www.cnblogs.com/onlyac/archive/2017/01/09/6266604.html
-Advertisement-
Play Games

本篇將去探索twemproxy源碼的主幹流程,想來對於想要開始啃這份優秀源碼生肉的童鞋會有不小的幫助。這裡我們首先要找到 twemproxy正確的打開方式——twemproxy的文件結構,接著介紹twemproxy程式代碼框架,最後介紹twemproxy程式的主幹流程。主幹流程是本章節的重中之重。這 ...


本篇將去探索twemproxy源碼的主幹流程,想來對於想要開始啃這份優秀源碼生肉的童鞋會有不小的幫助。這裡我們首先要找到 twemproxy正確的打開方式——twemproxy的文件結構,接著介紹twemproxy程式代碼框架,最後介紹twemproxy程式的主幹流程。主幹流程是本章節的重中之重。這次主要是為了能將這份代碼較為複雜的流程進行一些簡單的模塊分解和流程分解,以方便我們後面的閱讀。

twemproxy的文件結構

當然接下來首先要上一幅圖,就是twemproxy的文件結構圖

圖1 文件結構圖

如圖1所示,src下的是我們最重要的業務代碼,這裡有幾個重要的文件夾,1文件夾里的是網路編程模型,裡面包含epoll,kqueue以及evport幾個常用的模型。2文件夾里的是哈希演算法,其主要來哈希redis協議或者memcache協議的key,包括crc16,crc32,MD5等哈希演算法。3是比較重要的文件,它是在這裡不僅完成瞭解析redis協議或者memcache協議,還完成了這兩個協議的分片工作。

這裡還有幾個重要的文件組,4是程式的入口,如圖所示,main函數就在其中,5是管理與客戶端的連接,6是用來解析配置文件的,7是實現了透明連接池的,8是可以看到主要的程式流程,9是實現了記憶體管理的記憶體池,10是數據收發的主幹流程,11是數據請求和響應,是數據收發流程10的具體實現,12是用於管理與伺服器的連接。

這裡可以初步窺視到twemproxy精緻的代碼結構和高可讀性,通過查看文件的名字,我們竟然可以大概YY出這個文件下的代碼的作用,而且是八九不離十。

 

通過這個我們得到了閱讀代碼的整體思路(我們本次閱讀代碼的重點是redis伺服器集群下的twemproxy)

1.首先以10,11為主線來觀察整個程式的收發流程,因為我們知道作為一個緩存中間件代理,最重要的無非是與客戶端以及伺服器的交互流程。

2.再在主幹流程上慢慢拓展,通過探索3文件夾里的解析分片功能,來談下redis協議的細節和它能進行分片的原因。

3.接著通過上述標紅的各功能點6,7,9去觀察整個程式,這樣對於程式的實現細節有一定的瞭解。

4.最後我們再去觀察一些次要的功能點,如監控,日誌記錄以及哈希演算法等功能的實現。

 

twemproxy的主幹流程概述

接下來我們要探索twemproxy的主幹流程,首先我們要知道twemproxy與外界如何交互的,在上文《twemproxy架構分析》中,我們知道了twemproxy架構的架構,為此,我們可以抽象出一幅圖形

圖2.twemproxy零層數據流圖

如圖2,這裡的conn是表示由客戶端發起的與twemproxy的連接,而s_conn是由twemproxy發起的twemproxy的連接

這樣我們可以將數據收發過程分成以下四步:

1.twemproxy首先接受客戶端發起的conn請求。

2.再通過哈希conn請求的key值將其切分成具有相同key哈希值的請求——s_conn請求發給服務端——redis服務集群

3.接著等待接受來自服務端——redis服務集群的s_conn響應,通過這之前的映射關係將其和conn請求關聯起來。

4.最後將每一個conn請求對應的每一個conn響應發給客戶端。

 

我們能收發數據的一個重要原因是redis伺服器的實現是單線程的,為此,twemproxy的實現也是單線程的。

這樣我們可以將其分成兩個部分,與客戶端交互的1,4是客戶層,與服務端交互的2,3是服務層。這樣twemproxy就被分成了下麵一幅圖。

圖3. twemproxy流程細化圖

接著,我們將服務層和客戶層細分成4個模塊,我們可以認為1是客戶層接收,2是服務層發送,3是服務層接收,4是客戶層發送。這樣無疑1,2步驟構成了圖1中11的nc_request.c的主要內容,而3,4構成了圖1中11的nc_response.c的主要內容,如圖4所示。

 

 

圖4. twemproxy模塊圖

 

然後,在圖1中10的nc_message代碼閱讀中我們會發現有兩個重要流程:一個是發送流程msg_send和一個接收流程msg_recv

其實2和4是遵循同一個發送流程msg_send,而1和3是遵循同一個接收流程msg_recv。

最後在圖1中的8我們看到這兩個流程通過epoll模型感知程式究竟要執行哪個操作,即是執行msg_send流程還是執行msg_recv流程。

 

這樣我們通過上述的圖2,圖3以及圖4,將圖1中10、11以及8中要完成的主要流程進行了分析,構建了他們之間的基本聯繫,對於閱讀代碼有了一個骨架,相信未來通過對於這兩個流程和4個模塊的關鍵代碼分析,我們就可以“會當凌絕頂,一覽眾山小”。

 

總結

通過對源碼文件結構的探索,我們知道了twemproxy的主幹內容和關鍵點,明確了閱讀twemproxy代碼的流程,接著分析twemproxy的主幹內容,我們歸納出了我們未來閱讀代碼的兩個重要流程即發送流程msg_send和接收流程msg_recv,還有四個主要模塊即:客戶層接收、服務層發送、服務層接收以及客戶層發送,明確了各個模塊的功能、兩個流程與各個模塊的聯繫。下一章將首先完成兩個重要流程代碼的講解。

 

 




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

-Advertisement-
Play Games
更多相關文章
  • 今天使用SQLCMD導入到SQL SERVER資料庫中,看著數據文件都成功執行,但是意外發現有一個文件數據沒有成功導入,但執行不報錯,很容易導致問題被忽略。 使用存在問題的文件做下測試,從界面上看幾行腳本沒有任何問題: 4條INSERT語句“幾乎”一樣,區別在於最上面三行的部分文字是我從問題語句中粘 ...
  • 未來的BI市場是巨大的,涉及的觸角也會越來越多。就我觀察到的企業應用以及數據類產品中發現,很多企業通過數據介面引入了更多外部的數據來完善分析,也有部分企業私有化部署的BI產品在往雲BI方向發展。與R語言、數據挖掘類技術的集成,也將進一步提高數據分析的深度。 ...
  • 本文出處:http://www.cnblogs.com/wy123/p/6266724.html 最近在學習 WITH RECOMPILE和OPTION(RECOMPILE)在重編譯上的區別的時候,無意中發現表值函數和內聯表值函數編譯生成執行計劃的區別下文中將會對此問題展開討論。簡單地說就是:同樣一 ...
  • 下麵開始記錄一下,自己在Oracle或者PLSQL常用的幾個函數, 顯示效果如下圖所示: 與此同時,和他相同的函數是下麵的函數 顯示效果如下圖所示: ...
  • ...
  • 雙擊pkg文件安裝 一路向下,記得保存最後彈出框中的密碼(它是你mysql root賬號的密碼) 正常情況下,安裝成功。 此時只是安裝成功,但還需要額外的配置: (1) 進入系統偏好設置 (2) 點擊mysql 開啟mysql服務 此時我們在命令行輸入mysql -uroot -p命令會提示沒有co ...
  • 記憶體分配機制Slab Allocation 本文參考博客:https://my.oschina.net/bieber/blog/505458 Memcached的記憶體分配是以slabs為單位的,會根據初始chunk大小、增長因數、存儲數據的大小實際劃分出多個不同的slabs class,slab c ...
  • 大綱簡介 安裝前,先簡單介紹一下memcached。 memcached是一個免費、開源、高性能的分散式緩存。設計memcached的初衷是為了加快web應用程式,減少DB負載。 安裝要求:支持大多數linux和基於BSD的系統,官方沒有給出windows版本,但是網上有memcached for ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...