新聞中心
從上一篇文章中我們都了解了什么是Ring Buffer以及它是如何的特別。但遺憾的是,我還沒有講述如何使用Disruptor向Ring Buffer寫數(shù)據和從Ring Buffer中讀取數(shù)據。

10年積累的成都網站建設、成都網站設計經驗,可以快速應對客戶對網站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網絡服務。我雖然不認識你,你也不認識我。但先網站設計后付款的網站建設流程,更有新民免費網站建設讓你可以放心的選擇與我們合作。
ConsumerBarrier與消費者
這里我要稍微反過來介紹,因為總的來說讀取數(shù)據這一過程比寫數(shù)據要容易理解。假設通過一些“魔法”已經把數(shù)據寫入到
Ring Buffer了,怎樣從
Ring Buffer讀出這些數(shù)據呢?
(好,我開始后悔使用Paint/Gimp 了。盡管這是個購買繪圖板的好借口,如果我繼續(xù)寫下去的話… UML界的權威們大概也在詛咒我的名字了。)
消費者(Consumer)是一個想從Ring Buffer里讀取數(shù)據的線程,它可以訪問ConsumerBarrier對象——這個對象由RingBuffer創(chuàng)建并且代表消費者與RingBuffer進行交互。就像Ring Buffer顯然需要一個序號才能找到下一個可用節(jié)點一樣,消費者也需要知道它將要處理的序號——每個消費者都需要找到下一個它要訪問的序號。在上面的例子中,消費者處理完了Ring Buffer里序號8之前(包括8)的所有數(shù)據,那么它期待訪問的下一個序號是9。
消費者可以調用ConsumerBarrier對象的waitFor()方法,傳遞它所需要的下一個序號.
1 | final long availableSeq = consumerBarrier.waitFor(nextSequence); |
ConsumerBarrier返回RingBuffer的最大可訪問序號——在上面的例子中是12。ConsumerBarrier有一個WaitStrategy方法來決定它如何等待這個序號,我現(xiàn)在不會去描述它的細節(jié),代碼的注釋里已經概括了每一種WaitStrategy的優(yōu)點和缺點 。
接下來怎么做?
接下來,消費者會一直原地停留,等待更多數(shù)據被寫入Ring Buffer。并且,一旦數(shù)據寫入后消費者會收到通知——節(jié)點9,10,11和12 已寫入?,F(xiàn)在序號12到了,消費者可以讓ConsumerBarrier去拿這些序號節(jié)點里的數(shù)據了。
拿到了數(shù)據后,消費者(Consumer)會更新自己的標識(cursor)。
你應該已經感覺得到,這樣做是怎樣有助于平緩延遲的峰值了——以前需要逐個節(jié)點地詢問“我可以拿下一個數(shù)據嗎?現(xiàn)在可以了么?現(xiàn)在呢?”,消費者(Consumer)現(xiàn)在只需要簡單的說“當你拿到的數(shù)字比我這個要大的時候請告訴我”,函數(shù)返回值會告訴它有多少個新的節(jié)點可以讀取數(shù)據了。因為這些新的節(jié)點的確已經寫入了數(shù)據(Ring Buffer本身的序號已經更新),而且消費者對這些節(jié)點的唯一操作是讀而不是寫,因此訪問不用加鎖。這太好了,不僅代碼實現(xiàn)起來可以更加安全和簡單,而且不用加鎖使得速度更快。
另一個好處是——你可以用多個消費者(Consumer)去讀同一個RingBuffer ,不需要加鎖,也不需要用另外的隊列來協(xié)調不同的線程(消費者)。這樣你可以在Disruptor的協(xié)調下實現(xiàn)真正的并發(fā)數(shù)據處理。
BatchConsumer代碼是一個消費者的例子。如果你實現(xiàn)了BatchHandler, 你可以用BatchConsumer來完成上面我提到的復雜工作。它很容易對付那些需要成批處理的節(jié)點(例如上文中要處理的9-12節(jié)點)而不用單獨地去讀取每一個節(jié)點。
更新:注意Disruptor 2.0版本使用了與本文不一樣的命名。如果你對類名感到困惑,請閱讀我的變更總結。
原文鏈接:http://ifeve.com/dissecting-the-disruptor-how-do-i-read-from-the-ring-buffer/
譯文鏈接:http://ifeve.com/dissecting_the_disruptor_how_doi_read_from_the_ring_buffer/
分享名稱:如何使用Disruptor(二)從Ringbuffer讀取
當前URL:http://m.fisionsoft.com.cn/article/dpidocs.html


咨詢
建站咨詢
