Disruptor消费者依赖关系与等待策略
解释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 | 阶段式降级 | 综合策略 |