DIOCP開源項目-高效穩定的服務端解決方案(DIOCP + 無鎖隊列 + ZeroMQ + QWorkers)

[概述]

自從上次發佈了[DIOCP開源項目-利用隊列+0MQ+多進程邏輯處理,搭建穩定,高效,分佈式的服務端]文章後,得到了很多朋友的支持和肯定。這加大了我的開發動力,經過幾個晚上的熬夜,終於在昨天晚上,DEMO基本成型,今天再加入了QWorkers來做邏輯處理進程,進一步使得邏輯處理進程更加方便和高效。今天特意寫篇blog來記錄我的心得與大家分享。

 

[功能實現說明]

沿用上次的草圖

目前DEMO圖上的功能都已經實現。下面談談各部分的實現。

 

  • 通信服務, 由DIOCP實現,擔當與客戶端的通信工作,負責接收數據包,處理粘包和數據回傳的工作
  • 數據分發隊列, 由uWorkDispatcher單元實現, 其中利用 OTL中的無鎖隊列擔當數據的緩存,在使用uJobPusher推送隊列中的任務。
  • 數據推送,由ZeroMQ完成,使用Push/Pull模式,由於第一次接觸ZeroMQ,可能沒有挖掘到ZeroMQ的潛力,導致現在進程之間傳遞都是線程操作,開始一直擔心這個問題,遲遲沒有下手,最後還是堅持用了,效果還不錯。
  • 邏輯處理進程,由主控臺程序完成,裏面主要收到數據分發隊列中分發過來的任務後,進行邏輯處理,然後再將需要返回的數據,推送回通信服務進程(由uJobReceiver單元處理),並投遞到DIOCP傳輸隊列,該進程中使用到QWorkers。等一下我專門介紹這個方便的隊列任務處理類。
  • 客戶端,由TCPClient實現數據的通信。

 

[QWorkers說明]

之前一直想設計一個這樣的東西,幾次下來都不如意,自從接觸到QWorkers後,發現原來應該這樣去設計。下面是我研究QWorkers畫的一流程圖。一箇中午的吃飯的時間,基本上就可以理解80%,作者設計思路明確,使用簡單,而且隊列使用原子鎖,也比使用臨界高效不少。作者是QDAC開源項目的發起人。

image

主要作用,任務(可以單次任務,定時任務(比如每天12:00執行), 延時任務, 手動觸發任務)的投遞和執行。適合做邏輯運算任務。具體使用可以參考DEMO[DIOCP/Demos/MultiProcessor/processorWithQWorker]

 

[ZeroMQ]

ZeroMQ是一種基於消息隊列的多線程網絡庫,其對套接字類型、連接處理、幀、甚至路由的底層細節進行抽象,提供跨越多種傳輸協議的套接字。ZeroMQ是網絡通信中新的一層,介於應用層和傳輸層之間(按照TCP/IP劃分),其是一個可伸縮層,可並行運行,分散在分佈式系統間。

推薦大家看兩遍blog, 我就不多寫了。

ZeroMQ研究與應用分析:  ttp://www.cnblogs.com/rainbowzc/p/3357594.html

Delphi實戰: http://my.oschina.net/zeroflamy/blog/109457

 

[關於DEMO]

程序使用XE5編譯,

服務端(SERVER):DIOCP是支持D7-XE6的,所以Server可以用D7-XE6原理上是可以編譯的,只是工程文件是XE5編譯的,需要自己稍作處理

客戶端(TCPClient): D7-XE6都應該沒有問題。使用的標誌控件(TcpClient),標準寫法.

邏輯處理進程(processor):超級簡單的處理進程。D7-XE6

邏輯處理進程(processorWithQWorker):由於使用了QWorkers,只能支持D2007以上的版本.

 

[關於解決方案的應用]

該框架主要用於ERP的三層框架。邏輯處理進程可以實現熱拔插。可以啓動多個。自動接收任務。底層穩定,持續幾個月的服務端再也不是什麼難事了….

後續會結合MyBean框架做一些例子的整合。

 

歡迎大家繼續關注。

發佈了5 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章