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