標籤:
本文向大家介紹一種基於Qt的伸縮TCP服務實現。該實現針對C/Sclient-服務叢集應用需求而搭建。
串連監聽、傳輸資料、資料處理均在獨立的線程池中進行,依據特定任務不同,可安排負責監聽、傳輸、處理的線程數目,從而在高傳輸負荷、高計算符合上達成取捨。資料處理採用流水線結構。以避免少量客戶的密集計算請求影響其它client的處理。
本文相應的代碼符合LGPL協議,可直接從https://github.com/goldenhawking/zpserver下載. 也可從http://download.csdn.net/detail/goldenhawking/7461157 下載
一、綜述
在很多行業應用中。client-服務架構不可替代。
在client-服務架構下,服務扮演著重要的角色。
本文旨在介紹一種較為通用的服務實現形式。這個形式能夠依據詳細應用需求靈活配置。從而降低反覆開發的時間。該服務實現至少支援下列兩種需求。
第一類是轉寄型服務,主要負責溝通兩個client之間的通訊,本身不做複雜的處理。這樣的服務一般要承受密集的串連,在某些應用中。還要承受沉重的傳輸負荷。典型的包含即時通訊、兩個內網之間的視頻通訊等。
第二類是計算型服務,主要負責接收client的未經處理資料。處理後把結果返回。
這樣的服務一般執行在高效能server上,調用背景並行計算、異構計算資源。處理後把結果返回給client。這些服務的client數量一般不多。但在某些應用中,當輸入輸出資料量大時,傳輸負荷也非常重。
為了滿足上述兩類需求,服務設計具備例如以下特點。
1、 可靈活設定監聽port
2、 監聽、傳輸、處理均在獨立的線程池中執行。
3、 可依據須要。靈活設定傳輸、處理線程的數目。
4、 對某個單一client的處理。不會顯著拖慢全部client的響應。
5、 須要支援分布式的叢集服務,典型的情況是基於若干實體電腦構成的快速區域網路實現進程叢集。
6、 可同一時候支援SSL與普通TCP串連。
這些特點決定了本系統的架構設計。
(一)系統結構
服務由下面幾個模組組成.
1、 網路傳輸模組。負責管理用於監聽、傳輸的通訊端,並控制資料流在不同線程中流動。
資料收發由一定規模的線程池負責,實現方法全然得益於Qt的線程事件迴圈。被綁定到某個Qthread上的Qobject對象。其訊號-槽事件迴圈由該線程負責。這樣,便可方便的指定某個通訊端對象使用的線程。
相同,受惠於Qt的良好封裝,直接支援Tcp通訊端及SSL通訊端。且在執行時可動態調整。(註:編譯這個模組須要Qt的SSL支援,即在 configure 時增加 -openssl 選項)
2、 任務流水線模組。負責資料的處理。
在計算密集型的應用中,資料處理負荷較重,須要和網路傳輸劃分開。
基於普通線程池的處理模式,也存在隊列堵塞的問題——若干個client請求的耗時操作,堵塞了其它client的響應。哪怕其它client的請求非常短時間就能處理完畢。也必須排隊等待。採用流水線線程池避免了這個問題。每一個client把須要做的操作進行粒度化,在一個環形的隊列中,線程池對單個client,每次僅處理一個粒度單位的任務。單個粒度單位完畢後。該client的剩餘任務便被又一次插入到隊列尾部。這個機制保證了client的總體延遲較小。
3、 服務叢集管理模組。該模組使用了網路傳輸模組、任務流水線模組的功能,實現了跨進程的server?àserver鏈路。
在快速區域網路中,串連是快速、穩定的。因此,該模組被設計成一種星型無中心網路。隨意新增server節點選擇現有server叢集中的隨意一個節點。接入後。通過廣播自己主動與其它server節點建立點對點連接。本模組僅僅是提供一個server到server的通訊隧道,不負責詳細通訊內容的解譯。對傳輸內容的控制。由詳細應用決定。
4、 資料庫管理模組。
該模組基於Qt的外掛程式式資料庫封裝QtSql。
資料庫被作為資源管理。支援在多線程的條件下。使用資料庫資源。
5、 架構介面。雖然常見的服務執行時表現為一個後台進程。但為了更好的示範server的功能。避免繁瑣的配置,還是須要一個圖形介面來顯示狀態、設定參數。
本範例中,介面負責輪訓server的各個狀態。並設定參數。設定好的參數被儲存在一個ini檔案裡,並在服務開啟時載入。
6、應用專有部分模組。上述1-4共四個主要模組均是通用的。
他們互相之間沒有形成聯絡,不過作為一種資源存在於程式的執行時(Runtime)之中。
應用專有部分模組依據詳細任務需求,靈活的使用上述資源,以實現功能。在範例代碼中,實現了一種點對點的轉寄機制。示範者虛擬出一些工業裝置。以及一些操作員使用的client軟體。裝置與client軟體在成功認證並登入後,須要交換資料。改變這個模組的代碼,就可以實現自己的功能。
(二) 設計效能
項目 |
指標說明 |
指標值 |
備忘 |
支援的連線類型 |
取決於Qt的支援類型 |
SSL和Plain |
執行時同一時候支援兩類. |
協議 |
Ipv4 TCP , IPV6 Tcp |
|
設計單進程串連數 |
在4\8傳輸線程配置下計算 |
1024\2048 |
取決於實際機器的效能和任務形式. |
設計叢集規模 |
星型叢集的規模受到節點數影響。 |
100節點,9900個跨server串連。 |
區域網路中的串連數為節點數*(節點數-1)。 |
設計總使用者規模 |
100節點、每節點2048個使用者 |
20萬 |
|
下一篇文章,將開始介紹各個模組的設計思路。先給出範例代碼的測試編譯環境:
1、Ubuntu 14.04 + Qt5.2.1 openSSL 自編譯版
2、Win 7 x64 + VCExpress 2013 x64, x86 + Qt 5.2.1 openSSL自編譯版
3、Win XP x86 + VC2010Express x86 + Qt5.2.1openSSL自編譯版
主要介面:
一種基於Qt的可伸縮的全非同步C/S架構server實現(一) 綜述