簡體   English   中英

java中使用lmax Disruptor(3.0)處理百萬文檔

[英]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 正在處理文檔(來自我的日志),然后過了一段時間,生產者開始將更多文檔發布到環形緩沖區。

問題:

  • 我是否使用了正確的 Disruptor 模式? 我看到有很多方法可以使用它。 我選擇使用 batchEventProcessor 所以它會發出endOfBatch信號。
  • 如何提高 EventHandler 的效率? processDocumentsList 可能很慢。
  • 我應該使用並行 EventHandlers 嗎? lmax 用戶指南提到這是可能的, FAQ 中有一個問題。 但是如何將它與 batchEventProcessor 一起使用? 它只需要一個 eventHandler。

你的handler有狀態的嗎? 如果沒有,您可以使用多個並行事件處理程序來處理文檔。 您可以實現一種基本的分片策略,其中只有一個處理程序處理每個事件。

endOfBatch通常用於通過優化受益於批處理的 IO 操作來加快處理速度。 例如,在每個事件上寫入文件,但僅在endOfBatchendOfBatch

如果不知道文檔處理器中發生了什么,就很難提供更多建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM