【问题标题】:Getting the current number of messages in the ring buffer获取环形缓冲区中的当前消息数
【发布时间】:2014-12-11 10:14:42
【问题描述】:

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

【问题讨论】:

    标签: spring reactor disruptor-pattern lmax


    【解决方案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();
    }
    

    【讨论】:

    • 但是如果您需要在另一个没有暴露sequencer 的框架内监控破坏者remainingCapacity 怎么办?例如问题在于基于中断器的 log4j2 异步记录器:据我调查,没有有效的方法可以在那里获取sequencer
    • 看起来一种选择是只使用公开的 ringBuffer.remainingCapacity()。
    • @yetanothercoder 在 log4j2 中有什么方法可以将剩余容量作为 bean 公开吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      • 2020-10-06
      • 2016-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      相关资源
      最近更新 更多