disruptor中多執行緒消費者的疑問

oleio發表於2013-05-04
請教下大家,關於disruptor 中的消費者
就拿通俗包裝產品做個例子, 生產者生產出產品後,將產品放入 ringBuffer, 然後消費者從ringBuffer中取得產品進行包裝。

我理解的 在disruptor中,生產者當然可以是多個,即多執行緒來處理,多個生產者同時向ringBuffer中填充產品,這個由disruptor來處理並行寫入問題。

問題是,在大多數場景中,我們不光需要 並行的生產者,更需要並行的消費者。

而在 disruptor 框架中,如果我們定義了多個 EventHandler 的例項, 這些EventHandler 都會對每個產品 消費一次,
例如:
disruptor.handleEventsWith( new HelloEventHandler("first")
,new HelloEventHandler("second");

執行的結果是:
handler2-----pool-1-thread-2------:0
handler1-----pool-1-thread-1------:0
handler2-----pool-1-thread-2------:1
handler1-----pool-1-thread-1------:1
handler2-----pool-1-thread-2------:2
handler1-----pool-1-thread-1------:2
handler2-----pool-1-thread-2------:3
handler1-----pool-1-thread-1------:3

從上述結果可以看到 , 每一個handler是啟動了一個執行緒來處理,但是其從RingBuffer中取出的資料會重複。

例子是參考:
Disruptor例項:單生產者-多消費者 , 這篇文章的內容: http://www.jdon.com/44868



我本來的目的是希望 HelloEventHandler 的這兩個例項可以分別啟動執行緒並行執行,以並行消費產品。

但事實上, 生產者沒產出一個產品, 每個消費者例項都會重複的執行一遍。


因此我想問一下,在disruptor 應該如何來實現 有多個消費者執行緒 同時來獲取RingBuffer中的產品,而不會重複執行呢

難道必須在EventHandler中自行判斷當前所傳遞的事件是否已經被消費過才可以的嗎?
如果這樣的話,消費者中判斷是否已處理過產品,豈不又涉及到多執行緒問題了。

另外也想聽取一下 大家對 Disruptor中 啟動消費者數量的建議,系統中啟動多少生產者,多少消費者 ,有哪些衡量點和參考。

謝謝。

[該貼被oleio於2013-05-04 17:04修改過]

相關文章