2015-01-05 43 views
0

在多生產者設置中,有一個生產者線程和一個消費者線程。消費者是否可以將新事件發回相同的環形緩衝區?我假設當緩衝區已滿並且消費者線程在當前事件中工作時永遠不會獲得空閒插槽時,它會中斷。換句話說,發生死鎖。消費者如何回到同一個Disruptor環緩衝區

這樣做的最好方法是什麼?我是否必須引入一種代理線程來接收消費者的事件並將它們發佈到環形緩衝區中,就像普通生產者一樣?

補充 - 爲什麼是它有用嗎? 假設消費者線程正在處理股票市場數據事件,並且需要向市場模擬器(一個類)發送訂單,並且市場模擬器應該將訂單執行事件發送到相同的環形緩衝區,理想的情況是。

+0

除了最簡單的形式,不能有多個生產者嗎?如果是這樣,一個消費者很可能是一個製片人,對嗎?警告:我唯一接觸這種模式的方式來自Martin Fowler的一篇文章。 –

+0

不能有多個生產者嗎? - >是/ *空格*/ 如果是這樣,一個消費者可能是一個製片人,對吧? - >不,不確定的推理。想一想,如果一個線程在已經擁有鎖的時候試圖獲得一個鎖,會發生什麼。 –

回答

1

提供了在問題的更多細節的光單獨答案(我仍然相信我原來的答覆是有效的)。

在我的腦海/經驗,你正在試圖做得多一氣呵成爲您混爲一談環形緩衝區的消費者和出版商通常是分開的擔憂。我通常希望仿真器的響應事件以與處理原始事件相同的方式傳遞到環形緩衝區。

話雖如此,你要求的實際上是可能的。

但是,您必須做更多自己的工作,並編寫自定義EventProcessor,這將允許您在嘗試發佈事件之前將傳入消息標記爲已處理(從而釋放插槽)。

+0

謝謝山姆。重新回答有問題的問題,可能我會選擇以下選項之一:1)避免消費者線程直接發佈到環形緩衝區,因爲這不是Disruptor的主要設計目標,2)將事件發佈到單獨的帖子/將事件轉發到環形緩衝區,3)按照您提到的方式編寫自定義EventProcess類型,並且還需要確保一個傳入事件不會生成一個以上的新事件。 (我會接受這個答案) –

+0

你已經明白了。一般來說,設置將由網絡消費者發佈到環形緩衝器A,業務邏輯消耗來自A的事件併發布到環形緩衝器B.環形緩衝器B上的消費者將發佈事件回到網絡。 –

0

如果您使用Single producer設置,則消費者不能回發到環形緩衝區,因爲它不是Single producer

退一步說,爲什麼會一個且只有一個消費者永遠需要寫入環形緩衝區?它已經知道它做了什麼,沒有別的東西會從緩衝區讀取。

如果你有多個消費者,你可以寫回緩衝,但要確保額外的消費者在其上寫回緩衝區,而不是生產者序列消費者選通。

+0

在多個消費者設置中,假設當前環形緩衝區已滿並且消費者線程被喚醒以處理第一個事件。在處理事件時,它需要回寫到同一個環形緩衝區。由於正在處理的插槽不是空閒插槽,所以消費者線程將永遠無法獲得空閒插槽,因此發生死鎖。是這樣嗎? –

+0

假設您的消費者是*也是製片人,即它聲稱在環形緩衝區中有一個新的插槽,而不僅僅是剛纔讀取的插槽中的靜音,那麼您是否有死鎖。 如果你想擁有相關的消費者,那麼這種方法就是改變你讀取的插槽中的狀態(例如填充反序列化的字段),而不是消耗額外的環形緩衝區插槽。 –

+0

謝謝你的回覆,山姆。沒有依賴的消費者,因爲我需要最小化線程數量。(順便說一句,我添加了一個原始問題的背景) –

相關問題