获取环形缓冲区中的当前消息数

时间:2014-10-16 06:35:57

标签: spring reactor disruptor-pattern lmax

我在我的网络应用程序中使用Spring的Reactor模式。在内部,它使用 LMAX的RingBuffer 实现作为其消息队列之一。我想知道是否有任何方法可以动态地找出当前的RingBuffer占用率。它将帮助我确定所需的生产者和消费者的数量(以及它们的相对费率),以及RingBuffer作为消息队列是否被最佳地使用。 我尝试了 reactor.event.dispatch.Abs​​tractSingleThreadDispatcher 类的 getBacklog(),但似乎总是给出相同的值:我在实例化时使用的RingBuffer的大小反应堆。
对此问题的任何启示都将不胜感激。

2 个答案:

答案 0 :(得分:1)

使用 com.lmax.disruptor.Sequencer.remainingCapacity() 要访问 Sequencer 的实例,您必须明确创建它以及 RingBuffer

在我的情况下初始化即将离开的Disruptor

Disruptor<MessageEvent> outcomingDisruptor = 
    new Disruptor<MessageEvent>(
        MyEventFactory.getInstance(),
        RING_BUFFER_OUT_SIZE, 
        MyExecutor.getInstance(), 
        ProducerType.SINGLE, new BlockingWaitStrategy());

转换为

this.sequencer = 
    SingleProducerSequencer(RING_BUFFER_OUT_SIZE, new BlockingWaitStrategy());
RingBuffer ringBuffer = 
    new RingBuffer<MessageEvent>(MyEventFactory.getInstance(), sequencer);
Disruptor<MessageEvent> outcomingDisruptor = 
    new Disruptor<MessageEvent>(ringBuffer, MyExecutor.getInstance());

然后

this.getOutCapacity() {
    return sequencer.remainingCapacity();
}

更新

小虫子:| 我们需要 outMessagesCount 而不是 getOutCapacity

public long outMessagesCount() {
    return RING_BUFFER_OUT_SIZE - sequencer.remainingCapacity();
}

答案 1 :(得分:0)

mvnrepository(版本1.1.4 RELEASE)中的 reactor-core 的最新版本无法动态监视消息队列的状态。但是,经过github上的reactor代码后,我找到了 TraceableDelegatingDispatcher ,它允许在运行时跟踪消息队列(如果底层调度程序实现支持),它的remainingSlots()方法。最简单的选择是编译源代码并使用它。