2

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

4

2 回答 2

2

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

于 2014-10-17T11:06:44.460 回答
2

使用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();
}
于 2014-10-16T16:22:18.133 回答