Chaos網路庫(一) 開篇介紹

2022-07-04 12:27:10 字數 3303 閱讀 9627

chaos是乙個基於linux平台, reactor模式的網路事件庫, 目前僅支援tcp傳輸協議, 僅在x86_64下編譯, 並遵循3-clause bsd開源協議. 在使用上, 可以說它很像boost asio, 可能是由於我對boost asio的介面設計很有愛吧, 而且對於boost asio在非同步程式設計方面的思想, 我個人也比較認同, 但至今我也沒有仔細閱讀過boost asio的原始碼, 一是boost的模板化程式設計在可讀性上讓我比較折磨, 其二則是不想在對設計先入為主的情況下去開發chaos, 很多事情只有我們自己親自去思考, 才能有所收穫.

進入主題, 關於chaos庫原始碼和所有測試用例和應用服務, 都可在

原始碼目錄結構

chaos庫原始碼

async_method

用於非同步訊息佇列的實現, 是最小的task單位, 類似於boost::bind & boost:function

utility

常用工具類

thread

對pthread的封裝

task_service

核心模組, 包含了非同步訊息佇列, 網路i/o管理, 以及超時事件,task_service可以作為多執行緒非同步程式設計強大的工具而不單單作為乙個網路層的reactor模組(相當於boost asio的io_service)

log日誌元件

heart_beat

基於task_service的通用型元素心跳管理

network

基於task_service, 對tcp server進行了封裝, 底層i/o multiplexing使用epoll lt模式, 提供了常用的socket行為, 統一對連線進行管理, 並提供了使用者空間的讀寫緩衝區, 可以使開發者快速地搭建乙個tcp伺服器

test

一些測試用例, 小到乙個工具類的測試, 大到不同型別的伺服器程式

簡單的tcp server

要建立乙個tcp server, 使用chaos只要簡單的三步:

1.首先我們要先定義乙個連線事件**, 當chaos發現任何連線狀態的改變都會**該函式

2. 連線策略類的定義, 該類告訴chaos對於tcp資料報如何處理

這裡需要特別說明一點的是, 對於tcp位元組流的處理, chaos底層有預設的機制, 當乙個完整的資料報被讀取之後, handle_packet就會被呼叫, 可以看到, 服務在收到完整的資料報之後, 傳送了同樣的內容給對端.

預設策略的實現就在test_server_echo_conn_t所繼承的default_conn_strategy_t中, 該類對所有tcp位元組流的處理流程是:

預設策略的包頭成員:

如果你希望使用自己的tcp位元組流解析策略, 那麼可以自己繼承chaos::network::connection_t進行實現, 在初始化服務的時候注入自己的策略即可, 具體方式是提供乙個你繼承自connection_t的類, 然後作為tcp_service_t的模板引數

3.初始化並啟動服務

chaos::network::tcp_service_t類的執行機制是固定乙個執行緒做accept的工作, 而accept成功的連線會分派到各個wor**程上進行i/o, wor**程的數量可在start時指定.

這樣就完成了乙個簡單的tcp echo server的建立,  以上只是我擷取的關鍵**片段, 在chaos/test/echo_server目錄中有完整的**可供參考.

如何生成並應用chaos到自己的專案

chaos目前提供的鏈結方式是以靜態庫(.a)存在的, 你可以執行根目錄下的build_all.sh指令碼進行生成(需要安裝automake軟體), 你不需要再安裝任何第三方庫即可編譯整個chaos, 當編譯完成後會在根目錄生成lib臨時目錄,裡面即包含相應的chaos靜態庫, 之後可參照test目錄下的用例的方式鏈結到自己的專案中.

網路庫之外看chaos

之前我曾提到task_service不僅僅是作為乙個網路庫的reactor核心, 它亦可作為日常開發當中多執行緒及非同步程式設計的利器, 讓你不用關心執行緒切換, 多執行緒訊息投遞等細節問題, 通過簡單地將請求包裝成乙個非同步方法, 投遞到指定的task_service(執行緒池)中, 就能執行該任務, 在之後的系列文章中我會做詳細分析.

chaoslibevent, boost asio, ace, ice等知名庫的不同之處

從開始寫chaos時, 我的初衷可能就不是libevent, boost asio那樣的通用庫, 而是幫助使用者快速搭建乙個簡單易用的tcp服務, 基於reactor核心寫的network模組也是出於這個目的而做的封裝. 如果使用libevent或boost asio, 你依然要關心如何去接受乙個連線, 去建立啟動執行緒, 去驅動eventloop, 考慮如何分配執行緒, 如何管理連線, 而如果使用ace, ice, 又會顯得比較臃腫龐大, 另乙個角度看, ice是個網路服務解決方案, 而不是單純的網路庫, 而chaos就介於他們之間, 即保持著一定的輕量化, 也希望使用者能夠足夠易用快速開發, 當然, 這樣也必然會失去一些靈活性, 但我個人覺得這對於絕大部分應用都無傷大雅.

效能

對於部分應用來講, 雖然網路層不會成為整個服務的瓶頸所在, 但網路庫的效能依然至關重要, 我個人認為在本機做吞吐量的測試是乙個不錯的途徑, 而且不用考慮硬體網絡卡的限制, 我的方法是在同樣的機器環境上, 根據不同的應用層緩衝區大小, 連線數, 單執行緒/多執行緒 這幾個方面來評測.

具體流程是, 客戶端啟動n個執行緒並啟動n個tcp連線向伺服器傳送資料, 伺服器接收到完整的資料報之後馬上回傳相同內容給對端(如同上面的echo server), 一段時間後統計整個過程的吞吐量, 以下是我統計的相關資料:

測試環境資訊

伺服器型號: hp dl160

cpu: e5504

mem:

os: centos 5.8

當然, 需要一提的是這份吞吐量測試報告和其他一些網路庫的吞吐量測試沒有太大的可對比性, 畢竟不同的硬體環境,不同的測試**給結果帶來的差距比我們想象當中的要大.

吞吐量的測試客戶端可在test/throughput_client目錄中找到完整的**

伺服器**見echo_server

待續

CSS基礎(一) 開篇

背景 html是一種超文字標記語言,用來定義文件的結構和內容,例如標題 段落和列表等等,而文件內容如何渲染 如何展示,這就需要樣式來修飾了。css正是可以與html很好地結合。如果將html比作水,那麼css就是水杯,用怎樣形狀的水杯來裝水,水就顯示不一樣的形狀。什麼是css?css 指層疊樣式表 ...

C 底層機制(一) 開篇

很少有人質疑c語言生成 的高效和精悍,然而c 究竟能多麼接近c語言的水平呢?相信長期以來存在這樣的共識,核心演算法為了效率常常拋棄c 而使用c,他們認為c 龐大又遲緩,比如他們拒絕使用c 編寫資料庫引擎,他們說 繼承和過載降低效率,並且c 揹著你做很多事情 我相信通過之後的一系列文章,會幫助您破除圍...

linux驅動實踐 一 開篇

gnu arm彙編 系列寫了不少,收穫亦不小.依然還有很多可以繼續往下寫 一直想利用arm9的mmu寫個小的os 包含簡單裝置模型,任務排程和記憶體管理的os,網路和檔案系統就不要了.這個想法先放一下.另外對於uboot這樣乙個優秀的開源 也想做個深入的分析,但考慮到自己的bootloader也能引...