天天看點

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

沿用上次的草圖

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

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

通信服務, 由DIOCP實作,擔當與用戶端的通信工作,負責接收資料包,處理粘包和資料回傳的工作

資料分發隊列, 由uWorkDispatcher單元實作, 其中利用 OTL中的無鎖隊列擔當資料的緩存,在使用uJobPusher推送隊列中的任務。

資料推送,由ZeroMQ完成,使用Push/Pull模式,由于第一次接觸ZeroMQ,可能沒有挖掘到ZeroMQ的潛力,導緻現在程序之間傳遞都是線程操作,開始一直擔心這個問題,遲遲沒有下手,最後還是堅持用了,效果還不錯。

邏輯處理程序,由主要台程式完成,裡面主要收到資料分發隊列中分發過來的任務後,進行邏輯處理,然後再将需要傳回的資料,推送回通信服務程序(由uJobReceiver單元處理),并投遞到DIOCP傳輸隊列,該程序中使用到QWorkers。等一下我專門介紹這個友善的隊列任務處理類。

用戶端,由TCPClient實作資料的通信。

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

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

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

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

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

程式使用XE5編譯,

服務端(SERVER):DIOCP是支援D7-XE6的,是以Server可以用D7-XE6原理上是可以編譯的,隻是工程檔案是XE5編譯的,需要自己稍作處理

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

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

邏輯處理程序(processorWithQWorker):由于使用了QWorkers,隻能支援D2007以上的版本.

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

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

歡迎大家繼續關注。

繼續閱讀