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