| 原文地址: http://mechanitis./2011/06/dissecting-disruptor-whats-so-special.html? 作者是 Trisha Gee, LMAX 公司的一位女工程師。 最近我們開源了 LMAX Disruptor?,它是讓我們的交易流程變得如此之快的關鍵。為什么要開源它?因為我們意識到大家對高性能編程的傳統(tǒng)認知 ... 有些不對勁。我們找到了一個更好的,更快的在線程間共享數(shù)據(jù)的方法,如果不把它分享給大家就太自私了。而且,這會使我們看起來很酷。 從這個 網站? 你可以下載一份解釋什么是 Disruptor,以及它為什么如此巧妙和飛快的技術文檔。我從這里得到了一些寫作幫助,其實我真正做的只是在上面加了一些標點和重新組織了一些我不明白的句子,這太簡單了。 我發(fā)現(xiàn)要把這些東西一次性解釋清楚有些困難,所以我準備一小段一小段的解釋它們,以適合我的 NADD? 聽眾。 首先 - Ring Buffer。我對 Disruptor 的最初印象只有 Ring Buffer。后來我漸漸明白 Ring Buffer 結構是這個模式的中心,關鍵之處是 Disruptor 如何控制對它的訪問。 Ring Buffer 究竟是什么? 正如名字描述那樣 - 它是一個環(huán) (圓形,首尾相接的),你可以把它當作一個緩存 (buffer),用來在一個線程上下文與另一個線程上下文之間傳遞數(shù)據(jù)。 
 (好吧,我是用 Paint 畫的。我嘗試畫草圖,希望強迫癥沒有摻和進來要求我畫出完美的圓和直線)。  
 如果你持續(xù)向 buffer 中寫入數(shù)據(jù)(應該也會從里面讀數(shù)據(jù)),這個序號會一直增長,直到繞過整個環(huán)。 
 要找到數(shù)組中當前序號指向的元素,你可以用 mod 運算。 sequence mod array length = array index 因此對于上面的 Ring Buffer,這個算法就是(用 JAVA 的 mod 語法):12 % 10 = 2。很簡單。 其實圖片里畫著 10 個元素完全是一個意外。2 的 N 次方個元素會更好,因為計算機是用二進制思考的。     如果你從 Wikipedia 查到 Circular Buffers?,你會看到它與我們的實現(xiàn)方式有一個重要的差別-沒有指向末尾的指針。我們只有下一個可用的序號。這是刻意的-選擇 Ring Buffer 的根本原因是需要支持可靠的消息通信。我們需要把服務發(fā)出的消息存儲起來,那么當另一個服務發(fā)來一個 NAK (拒絕應答信號)?? 說他們沒有收到消息的時候,我們可以重新發(fā)送給他們。 Ring Buffer 看起來很理想。它用序號來指出 buffer 的末尾在哪里,而且當它收到一個 NAK 信號的時候,可以重發(fā)從那一點到當前序號之間的所有消息: 
 我們所實現(xiàn)的 Ring Buffer 與傳統(tǒng)隊列的區(qū)別是:buffer 里的對象不會被銷毀-它們留在那兒直到下次被覆蓋寫入。這是與 Wikipedia 上的版本相比我們的實現(xiàn)不需要尾指針的原因。在我們的實現(xiàn)中,確定 Ring Buffer 是否重疊的工作,是由數(shù)據(jù)結構之外來完成的(這是生產者與消費者行為的一部分-如果你來不及等我寫博客說明它,可以自己檢出 Disruptor 代碼??)。 Ring Buffer 這么棒是因為...? 
 我們使用 Ring Buffer 這種數(shù)據(jù)結構,是因為它給我們提供了可靠的消息傳遞特性。這個理由就足夠了,不過它還有一些其他的優(yōu)點。 首先,Ring Buffer 比鏈表要快,因為它是數(shù)組,而且有一個容易預測的訪問模式。這很不錯,對 CPU 高速緩存友好 (CPU-cache-friendly)-數(shù)據(jù)可以在硬件層面預加載到高速緩存,因此 CPU 不需要經?;氐街鲀却?RAM 里去尋找 Ring Buffer 的下一條數(shù)據(jù)。 第二點,Ring Buffer 是一個數(shù)組,你可以預先分配內存,并保持數(shù)組元素永遠有效。這意味著內存垃圾收集(GC)在這種情況下幾乎什么也不用做。此外,也不像鏈表那樣每增加一條數(shù)據(jù)都要創(chuàng)建對象-當這些數(shù)據(jù)從鏈表里刪除時,這些對象都要被清理掉。 文章缺少的部分 我沒有提到如何避免環(huán)重疊,以及怎么向 Ring Buffer 讀、寫數(shù)據(jù)的細節(jié)。你也會注意到我在拿它和鏈表那樣的數(shù)據(jù)結構相比較,我想沒人會認為鏈表是實際問題的解決方案。     | 
|  |