2013-07-17 31 views
3

LMAX Disruptor模式中,使用複製器將輸入事件從主節點複製到從節點。因此,設置可能會看起來如下:干擾模式 - 主節點和從節點如何保持同步?

enter image description here

主節點的複製事件寫入到數據庫(所有雖然我們能想到更好的機制比寫入到DB-它不是很重要問題陳述)。從節點的接收器從DB讀取並將事件放到從節點的環形緩衝區中。

忽略從節點的輸出事件。

現在有可能主節點的業務邏輯處理器比從節點的業務邏輯處理器慢。例如,主節點的示例BL可以位於槽102,其中從屬節點可以位於106.(這可能是因爲複製器在業務邏輯處理器之前從環形緩衝區讀取事件)。

在這種情況下,如果主節點發生故障並且從節點現在成爲主節點,那麼外部系統可能會漏掉一些關鍵事件。這可能發生,因爲節點2當它充當從屬節點時忽略了其輸出。

Martin Fowler確實聲稱複製器的工作是保持節點同步: 「早些時候,我提到LMAX在集羣中運行多個系統副本以支持快速故障切換,複製器使這些節點保持在同步「

但我不確定它如何讓業務邏輯處理器保持同步?有任何想法嗎?

回答

7

複製直接來自主節點而不是數據庫。從設備的確認複製門。上述

http://www.infoq.com/presentations/LMAX

鏈接進入更多細節,這是值得一讀的陳述意見的討論。

+0

感謝Martin的回覆。如果主設備的複製器「關閉」從設備的ACK,那麼在從設備關閉的情況下,主設備的業務邏輯處理器無法繼續?這種情況如何處理? – Ngm

+2

Disruptor是一種線程間消息傳遞模式。您的問題是關於在事件源系統中如何實現高可用性,因此超出了Disruptor的範圍。 Martin Folwer的文章只是Disruptor如何應用的一個例子。 –

+1

複製的一致性算法的一個例子可以在這裏找到https://ramcloud.stanford.edu/wiki/download/attachments/11370504/raft.pdf –

1

如果成本很低有丟棄的事件,那麼你可以忽略它(?)。

作爲一個簡單的實現,您可以讓主服務器上的輸出干擾程序通知從服務器它已完成發送數據包。把它看作是一個兩階段複製器 - 一個複製事件,另一個複製器來確認事件已經發送。

在現實世界的實現您可能需要在您的體系結構中額外支持下游(特別是重播/重試)。根據您的應用程序要求,您需要有能力檢測輸出事件是否存在差距,並根據需要提取它們。假設你的事件是冪等的,那麼應該沒有問題可以及時回顧並重放事件。

假設您的出站頻道丟失了單個數據包,或者您的互聯網線路斷開了?即使它從破壞者成功發出,它仍然可能會丟失。這取決於您的特定應用程序,需要更多的思考,而不是可以在此處考慮哪些故障場景可以容忍。

+0

我認爲如果我們認識到一個差距,回放事件的想法是重要的一個。謝謝 – Ngm