Disruptor-net 3.3.0


Disruptor 介紹

 

Disruptor 是LMX開源出來的java編寫的一個並發消息處理器,在隊列中一邊生產者放入消息,另外一邊消費者並行取出處理,其核心是根據現代CPU硬件緩存特點發明不同於通用LinkedList或Queue的新型數據結構RingBuffer

LMX 系統每秒處理600萬訂單,這是個神話!,其業務模式是:In Memory+Event Source+Disruptor

Disruptor 框架解決了鎖,偽共享帶來的性能影響

 為什么隊列干擾了緩存呢?解釋是這樣的: 為了將數據放入隊列,你需要寫入隊列,類似地,為了從隊列取出數據,你需要移除隊列也是一種寫,客戶端也許不只一次寫入同樣數據結構,處理寫通常需要鎖,但是如果鎖使用了,會引起切換到底層系統的場景(線程上下文切換—個人理解), 當這個發生后,處理器會丟失它的緩存中的數據。—摘自jdon

關於Disruptor 原理介紹網上很多,可以參考 馬丁.福勒 的關於Disruptor 架構介紹,以及其他資料很多的。

 

Disruptor 使用場景說明

 

任何一個技術方案都有個使用場景的Disruptor也不例外,此框架的使用場景總結如下:

補充個前提:那就是接到的消息量巨大,如果每秒不上萬,十萬,百萬,那還是不要使用這個框架了,你的消費處理不要太延遲,如果你把這個框架用於往

數據庫寫數據就不那么適當了。

1、處理CQRS架構風格的command命令(jdon framework底層也是用的disruptor)

2、接收消息並處理場景,如,短信,郵件發送服務

3、業務流水線模式

4、隊列使用場景也是Disruptor使用,反過來則未必

 

Disruptor-net介紹

Disruptor-net 是我在公司利用空余時間把java 版本的Disruptor移植到net 平台上,經過測試后,分享出來,如果有需要的童鞋可以下載下來使用,我上傳了全部源碼,你也可以修改,但請保留我的博客園地址鏈接,在使用過程中如果有問題請在博客園回復,我會處理並回復的。

網上有個Disruptor-net項目,這個項目是個老外寫的,但目前版本是2.10.0比較老,更新也慢;Disruptor java版本更新很快目前是3.2.0,我的Disruptor-net 也是基於這個版本移植過來的,重用了網上的2.10.0版本的策略調度(對於task及其策略調度網上有個parallel-extensions-extras項目,提供了task及其調度多種算法實現,其實在使用的Disriptor-net 的時候基於策略使用net 默認的就可以了),原子操作兩個模塊,呵呵,算是資源重用啦,java 版3.2.0 變動很大,很多類名及類的功能與2.10.0完全不一樣,增加了多個waitFor策略,ringBuffer也增加很多功能,在移植過程發現java里的接口命名都不加I前綴的,這個看起來很別扭,java 與 NET在具體實現上還是有很大的區別的,其中java里有很多C,C++的影子,java 目前不支持閉包,NET已經開始支持閉包,這在一定程度上提供間接的語法,為了與java版本的保持一致(便於以后升級維護)我在ringBuffer類,只增加了少量的函數閉包風格寫法,其他基本上遵循原版的風格(包括注釋,我發現eclipse里的java注釋,是有格式化而且可以連接跳轉,這點比vs里注釋友好多了)

基本上主流程上的每個類,都通過功能單元測試,性能單元測試(我使用的是Nunit.net ),感覺比VS 自帶的那個測試工具方便點。測試結果是ringBuffer並發處理能力遠遠超過BlockingCollection的並發處理能力,我的機器是 thinkpad x201i 4核 4G內存,極端情況下4個CPU全部100%,但內存占用量並不大。

 

性能測試(機器配置 thinkpad x201i 4核 4G內存)

有意思的是,Disrupt-net 測試與Disruptor-Java相差比較大, Disrupt-net最好ops出現8位數,Disruptor-Java平均在7-8位數作用,看了下這兩種不同平台測試時間算法是有區別的java用system.millitime 前后兩次相減,而NET使用DateTime.Now前后兩次相減,則ops可以達到每秒 9位數,此項目里測試全部使用Stopwatch計算時間。

1億個消息流水線程模式

 測試結果:

 

每秒消息處理量,運行20次,如下圖:

 

這種模式下BlockingCollection處理能力,太慢了一次處理大概需要150秒,ops每秒只有不到70萬,所以不貼圖了。

 

當然這種測試結果因硬件環境而不同!

總的來說,Disruptot的處理能力是驚人的,按照 ,In Memory+Event Source+Disruptor 這種架構風格處理業務,每秒處理600萬訂單,也是可能的。

 

這個版本作為技術研究用,代碼在 https://github.com/bingyang001/disruptor-net-3.3.0-alpha 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM