程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> DIOCP開源項目-高效穩定的服務端解決方案(DIOCP + 無鎖隊列 + ZeroMQ + QWorkers) 出爐了

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

編輯:Delphi

[概述]

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

 

[功能實現說明]

沿用上次的草圖

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

 

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

 

[QWorkers說明]

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

[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框架做一些例子的整合。

 

歡迎大家繼續關注。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved