Disruptor - Sequencer

本文深入探讨了Disruptor框架的核心组件Sequencer的功能与操作,包括声明序列号、跟踪依赖、发布事件及批量处理等关键操作。同时,介绍了如何通过SequenceBarrier确保事件的正确处理顺序,以及Sequencer中各种方法如next、publish、tryNext的作用和应用场景。

Sequencer 

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

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。

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

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)和当前游标的关系的管理。

 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值