CodeWalk

Disruptor消费者依赖关系与等待策略

作者:我还是少年 · 2026-05-30 12:55

解释Disruptor中如何实现消费者之间的依赖链(Diamond Dependency/Chain),以及BatchEventProcessor、WorkerPool的使用差异,还有各种等待策略的适用场景。

回答

我还是少年

1. 消费者依赖关系实现 Disruptor通过SequenceBarrier管理依赖:

  • 链式依赖(Chain):消费者C2依赖C1
    ringBuffer.addGatingSequences(c1.getSequence()); // C2的SequenceBarrier跟踪C1
    
  • 菱形依赖(Diamond):C2、C3依赖C1,C4依赖C2、C3
    disruptor.handleEventsWith(c1).then(c2, c3).then(c4);
    
  • WorkerPool:实现多线程竞争消费(Point-to-Point),每条消息只被一个消费者处理

2. 不同消费者模式

  • BatchEventProcessor:事件广播模式,每个消费者收到所有事件
    • 支持批量处理:process()中一次性获取多个事件
  • WorkerPool:工作池模式,事件分发给其中一个消费者
    • 使用WorkProcessor实现,通过workSequence协调

3. 等待策略(WaitStrategy) | 策略 | 说明 | 适用场景 | |------|------|------| | BlockingWaitStrategy | ReentrantLock + Condition,最省CPU | 低延迟不敏感,CPU资源受限 | | SleepingWaitStrategy | 循环等待→yield→parkNanos(1) | 吞吐量与CPU平衡 | | YieldingWaitStrategy | 循环等待→Thread.yield() | 低延迟,高吞吐 | | BusySpinWaitStrategy | while(true)无等待 | 极低延迟,处理器数>线程数 | | TimeoutBlockingWaitStrategy | 带超时的阻塞 | 有超时需求的场景 | | LiteBlockingWaitStrategy | 简化版阻塞 | 优化过的阻塞策略 | | PhasedBackoffWaitStrategy | 阶段式降级 | 综合策略 |