Disruptor - Sequencer

Sequencer 

  • Sequencer:当跟踪依赖的序列号(Sequence)时,配合声明的序列号去访问一个数据结构(RingBuffer)。

Disruptor - Sequencer_第1张图片

Disruptor - Sequencer_第2张图片

void claim(long sequence);

 声明一个具体的序列号。只有当RingBuffer初始化为一个具体值时使用这个方法。


boolean isAvailable(long sequence);

一个序列号被发布并且事件可以用来使用的;非阻塞。如果序列号可以用来使用返回true;否则返回false。


void addGatingSequences(Sequence... gatingSequences);

 给disruptor实例添加一个指定的门槛序列号。这将会安全并且自动地添加到门槛序列号列表中。


boolean removeGatingSequence(Sequence sequence);

 删除门槛序列号。


SequenceBarrier newBarrier(Sequence... sequencesToTrack);

 创建一个新的SequenceBarrier。交给EventProcessor来使用。用来跟踪ring buffer的给定的序列号列表中,看读取的消息是否      可用。


long getMinimumSequence();

 获取从所有添加到ring buffer的门槛序列号(gating sequences)中,最小的序列号。


long getHighestPublishedSequence(long nextSequence, long availableSequence);

 获取从ring buffer中可以安全读取的最高的序列号。


Cursored 

接下来看下Cursored。

Disruptor - Sequencer_第3张图片

(很简单,只有一个抽象方法。不再叙述。) 

Sequenced 

 然后看下Sequenced。


int getBufferSize();

 ring buffer中能够存储键值对的数量。


boolean hasAvailableCapacity(int requiredCapacity);

 是否有指定的容量可用。


long remainingCapacity();

 获取这个Sequencer中剩余的容量。


long next();

 声明下一个要发布的事件,返回序列号。


long next(int n);

 声明之后的n个要发布的序列号。批量事件生产。

* int n = 10;
* long hi = sequencer.next(n);
* long lo = hi - (n - 1);
* for (long sequence = lo; sequence <= hi; sequence++) {
*     // Do work.
* }
* sequencer.publish(lo, hi);

long tryNext() throws InsufficientCapacityException;

 尝试声明要发布的下一个事件。如果有要求容量的slot,那么就返回slot的数量。如果没有空间可用,直接抛出异常。


long tryNext(int n) throws InsufficientCapacityException;

(同理)


void publish(long sequence);

 发布一个序列号。当事件填充完毕时,这个方法被调用。


void publish(long lo, long hi);

 批量发布序列号。当事件填充完毕时,这个方法被调用。


AbstractSequencer

不同Sequencer类型(single/multi)的基类。提供了常见的功能像门槛序列号(add/remove)和当前游标的关系的管理。

 Disruptor - Sequencer_第4张图片

 bufferSize必须大于等于1并且是2的n次幂。

 

你可能感兴趣的:(Disruptor)