Disruptor 介紹java
Disruptor 是LMX開源出來的java編寫的一個併發消息處理器,在隊列中一邊生產者放入消息,另一邊消費者並行取出處理,其核心是根據現代CPU硬件緩存特色發明不一樣於通用LinkedList或Queue的新型數據結構RingBuffergit
LMX 系統每秒處理600萬訂單,這是個神話!,其業務模式是:In Memory+Event Source+Disruptorgithub
Disruptor 框架解決了鎖,僞共享帶來的性能影響算法
爲何隊列干擾了緩存呢?解釋是這樣的: 爲了將數據放入隊列,你須要寫入隊列,相似地,爲了從隊列取出數據,你須要移除隊列也是一種寫,客戶端也許不僅一次寫入一樣數據結構,處理寫一般須要鎖,可是若是鎖使用了,會引發切換到底層系統的場景(線程上下文切換—我的理解), 當這個發生後,處理器會丟失它的緩存中的數據。—摘自jdon數據庫
關於Disruptor 原理介紹網上不少,能夠參考 馬丁.福勒 的關於Disruptor 架構介紹,以及其餘資料不少的。緩存
Disruptor 使用場景說明數據結構
任何一個技術方案都有個使用場景的Disruptor也不例外,此框架的使用場景總結以下:閉包
補充個前提:那就是接到的消息量巨大,若是每秒不上萬,十萬,百萬,那仍是不要使用這個框架了,你的消費處理不要太延遲,若是你把這個框架用於往架構
數據庫寫數據就不那麼適當了。併發
一、處理CQRS架構風格的command命令(jdon framework底層也是用的disruptor)
二、接收消息並處理場景,如,短信,郵件發送服務
三、業務流水線模式
四、隊列使用場景也是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