java - 为什么 Java lmax Disruptor 在通过 EventProcessors 传递事件时有很大的延迟?

标签 java disruptor-pattern

我的项目中有一个环形缓冲区,其中很多发布者将发布事件(例如 500 个发布者),并且我有 3 个 EventProcessor 应该按顺序处理事件。所有事件都应该这样传递:

{很多发布者} -> {UpStreamProcessor} -> {DownStreamProcessor} -> {logProcessor}

问题是,我在 UpStreamProcessor 的发布和启动之间以及 UpStreamProcessor 的结束到 DownStreamProcessor 的启动之间传递事件时损失了很多时间。

例如,当我有 500 个发布者时,UpStreamProcessor 和 DownStreamProcessor 中的处理平均持续 1ms,而 UpStreamProcessor 完成时间到 DownStreamProcessor 启动时间之间持续 400ms。

这是构建环形缓冲区和处理器的代码片段:

SequenceBarrier sequenceBarrier;

receiveBuffer = new RingBuffer<>(
    MessageContext.FACTORY, 
    new MultiThreadedLowContentionClaimStrategy(inputBufferSize),
    new YieldingWaitStrategy()
);

upStreamAgentProcessor = new BatchEventProcessor<>(
    receiveBuffer,
    receiveBuffer.newBarrier(),
    new UpStreamAgent()
);
sequenceBarrier = receiveBuffer.newBarrier(
    upStreamAgentProcessor.getSequence()
);

downStreamAgentProcessor = new BatchEventProcessor<MessageContext>(
    receiveBuffer,
    sequenceBarrier,
    new DownStreamAgent()
);
sequenceBarrier = receiveBuffer.newBarrier(
    downStreamAgentProcessor.getSequence()
);

logMapAgentProcessor = new BatchEventProcessor<MessageContext>(
    receiveBuffer,
    sequenceBarrier,
    LogMap.getInstance()
);


receiveBuffer.setGatingSequences(logMapAgentProcessor.getSequence());

operationalExecutor.submit(upStreamAgentProcessor);
operationalExecutor.submit(downStreamAgentProcessor);
operationalExecutor.submit(logMapAgentProcessor);

最佳答案

Disruptor 的设计目的是处理需要 0.0001 毫秒的消息。如果 1 毫秒甚至 0.1 毫秒的延迟不打扰您,我会使用普通的 ExecutorService。如果您看到延迟或超过 0.001 毫秒,则不太可能是干扰,并且您正在执行的任务花费的时间太长。

这是关于协调遗漏的一个很好的演示。 http://www.infoq.com/presentations/latency-pitfalls坏消息是,如果您的瓶颈像您所看到的那样减慢了生产者的速度,则延迟可能比您测量的要严重得多。

关于java - 为什么 Java lmax Disruptor 在通过 EventProcessors 传递事件时有很大的延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19676204/

相关文章:

java - Spring 登录将我重定向到登录页面,即使我看到的页面不 protected

java - Android Viewpager 为空

java - 双循环赛

java - 创建像环形缓冲区一样批处理的 Observable(需要建议)

java - 如果 Disruptor 中的 next() 和publish() 之间抛出异常会发生什么?

java - 如何检查事件是否已在干扰器环形缓冲区中

java - 简洁存储常用方法的最佳方式

java - 为什么这个类被认为是可变的?

java - reactor lmax 线程转储

java - Disruptor - 未调用 EventHandlers