[英]Using lmax Disruptor (3.0) in java to process millions of documents
我有以下用例:
當我的服務啟動時,它可能需要在盡可能短的時間內處理數百萬份文檔。 將有三個數據源。
我已經設置了以下內容:
/* batchSize = 100, bufferSize = 2^30
public MyDisruptor(@NonNull final MyDisruptorConfig config) {
batchSize = config.getBatchSize();
bufferSize = config.getBufferSize();
this.eventHandler = config.getEventHandler();
ThreadFactory threadFactory = createThreadFactory("disruptor-threads-%d");
executorService = Executors.newSingleThreadExecutor(threadFactory);
ringBuffer = RingBuffer.createMultiProducer(new EventFactory(), bufferSize, new YieldingWaitStrategy());
sequenceBarrier = ringBuffer.newBarrier();
batchEventProcessor = new BatchEventProcessor<>(ringBuffer, sequenceBarrier, eventHandler);
ringBuffer.addGatingSequences(batchEventProcessor.getSequence());
executorService.submit(batchEventProcessor);
}
public void consume(@NonNull final List<Document> documents) {
List<List<Document>> subLists = Lists.partition(documents, batchSize);
for (List<Document> subList : subLists) {
log.info("publishing sublist of size {}", subList.size());
long high = ringBuffer.next(subList.size());
long low = high - (subList.size() - 1);
long position = low;
for (Document document: subList) {
ringBuffer.get(position++).setEvent(document);
}
ringBuffer.publish(low, high);
lastPublishedSequence.set(high);
}
}
我的每個來源都調用了消耗,我使用 Guice 創建了一個單例干擾器。
我的 eventHandler 例程是
public void onEvent(Event event, long sequence, boolean endOfBatch) throws Exception {
Document document = event.getValue();
handler.processDocument(document); //send the document to handler
if (endOfBatch) {
handler.processDocumentsList(); // tell handler to process all documents so far.
}
}
我在我的日志中看到生產者( consume
)有時會停止。 我假設這是在 ringBuffer 已滿時,並且 eventHandler 無法足夠快地處理。 我看到 eventHandler 正在處理文檔(來自我的日志),然后過了一段時間,生產者開始將更多文檔發布到環形緩沖區。
問題:
你的handler
有狀態的嗎? 如果沒有,您可以使用多個並行事件處理程序來處理文檔。 您可以實現一種基本的分片策略,其中只有一個處理程序處理每個事件。
endOfBatch
通常用於通過優化受益於批處理的 IO 操作來加快處理速度。 例如,在每個事件上寫入文件,但僅在endOfBatch
上endOfBatch
。
如果不知道文檔處理器中發生了什么,就很難提供更多建議。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.