簡體   English   中英

LMAX Disruptor依賴圖/使用SequenceBarrier進行門控

[英]LMAX Disruptor Dependency Graph/Gating with SequenceBarrier

目標

我正在嘗試在處理程序之間創建一個有點循環的依賴關系,我無法弄清楚如何正確處理它。 我想要實現的是producer -> [handlers 1-3] -> handler 4

所以, disruptor.handleEventsWith(h1, h2, h3).then(h4); 但我有額外的要求

  1. 雖然處理程序1-3確實並行處理消息,但它們都沒有開始處理下一條消息,直到它們完成了上一條消息。
  2. 在第一條消息之后,處理程序1-3在處理下一條消息之前等待處理程序4完成最新消息。

使用單個事件處理程序的等效執行邏輯可以是:

disruptor.handleEventsWith((event, sequence, endOfBatch) -> {
  Arrays.asList(h1, h2, h3).parallelStream()
        .forEach(h -> h.onEvent(event, sequence, endOfBatch));
  h4.onEvent(event, sequence, endOfBatch);
});

上下文

設計上下文是處理程序1-3每個根據消息更新它們自己的狀態,並且在三個處理消息之后它們處於一致狀態。 然后,處理程序4基於處理程序1-3更新的狀態運行一些邏輯。 因此,處理程序4應該只能看到由1-3維護的數據結構的一致狀態,這意味着處理程序1-3在處理程序4完成之前不應處理下一條消息。

(雖然目標肯定是使用Disruptor來管理並發,而不是java.util.Stream 。)

不確定是否重要,但也可以將處理程序4的邏輯分成兩部分,一部分要求處理程序1-3沒有被更新,而下一部分只要求處理程序4的第一部分已經完成。 因此處理程序1-3可以在處理程序4的第二部分仍在執行時處理消息。

有沒有辦法實現這個目標? 或許我的設計有缺陷? 我覺得應該有一種方法可以通過SequenceBarrier來做到這一點,但我不太明白如何實現這個自定義屏障。 對於處理程序1-3,我想我想用邏輯handlers[1:3].lastProcessedSequence() == handlers[4].lastProcessedSequence()制作一個障礙,但我不知道該放哪個邏輯。

謝謝!

我會考慮使處理程序是無狀態的,並使用它們處理的消息來包含系統的狀態。 這樣,您根本不需要同步處理程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM