gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:10:38 32 4
gpt4 key购买 nike

我的项目中有一个环形缓冲区,其中很多发布者将发布事件(例如 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com