[英]LMAX Disruptor Dependency Graph/Gating with SequenceBarrier
我正在嘗試在處理程序之間創建一個有點循環的依賴關系,我無法弄清楚如何正確處理它。 我想要實現的是producer -> [handlers 1-3] -> handler 4
。
所以, disruptor.handleEventsWith(h1, h2, h3).then(h4);
。 但我有額外的要求
使用單個事件處理程序的等效執行邏輯可以是:
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.