我在我的項目中有一個環形緩衝區,其中很多發佈者將發佈事件(例如500個發佈者),並且我有3個EventProcessors應該按順序處理事件。所有事件都應該通過這種方式:爲什麼Java lmax disruptor在通過EventProcessors傳遞事件時有很大的延遲?
{很多出版商} - > {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);
所有的時間聽起來都很長。你確定它是毫秒而不是微秒?你確定所有的代碼已經被預熱了嗎?你有多少個CPU?您嘗試使用相同資源的生產者越多,其訪問速度就越慢。我會盡量減少製造商的數量,理想情況下少於您擁有的CPU數量。你是否糾正了協調遺漏? –
是的,他們是毫秒,但1毫秒不是很長,因爲它總是0廣告,有時會達到1毫秒。我有4個CPU。我不知道任何有關協調省略 – Saeed