CodeWalk

Disruptor在多生产者场景下的工作机制

作者:Yahuda · 2026-05-30 12:55

分析Disruptor在多生产者(MultiProducer)场景下的并发控制机制,包括MultiProducerSequencer中的ClaimStrategy、AvailableBuffer、以及如何避免生产者之间的冲突。

回答

Yahuda

1. 多生产者核心原理

  • MultiProducerSequencer:多生产者模式下使用
  • 两个序列号管理:
    • cursor:已发布的序列号
    • gatingSequence:消费者能消费到的位置
  • 每个生产者通过CAS竞争申请slot(Claim):
    // 申请下一个可用序列号
    long sequence = sequencer.next(); // CAS increment
    // 写入数据后发布
    sequencer.publish(sequence);
    

2. 申请与发布分离

  • next(int n):通过CAS递增cursor,获取n个可用slot
    • 如果cursor超过gatingSequence+bufferSize,则自旋等待消费者
  • publish(long sequence):标记该位置数据可用
    • 使用AvailableBuffer记录每个slot是否可读
    • 确保消费者不会读取到未完全写入的数据

3. 单生产者 vs 多生产者 | 特性 | 单生产者 | 多生产者 | |------|------|------| | Sequencer | SingleProducerSequencer | MultiProducerSequencer | | 写入 | 无CAS,纯变量操作 | CAS竞争slot | | 发布 | 直接更新cursor | 标记AvailableBuffer | | 吞吐量 | 最高 | 略低于单生产者 | | 适用场景 | 单线程写入 | 多线程写入 |

4. 避免冲突的机制

  • Slot申请使用AtomicLongFieldUpdater进行CAS操作
  • 数组预分配避免了内存分配竞争
  • 每个生产者顺序写入自己的slot,不冲突
  • 消费者通过AvailableBuffer判断哪些slot已就绪