LMAX Distruptor Разделение и объединение пакетов

Итак, в настоящее время у меня есть реализация Executor с блокирующей очередью, и конкретная реализация похожа на то, что у меня есть список элементов для каждого запроса, и я делю их на разделы, каждый раздел затем вычисляется, и, наконец, они объединяются, чтобы получить окончательный список.

Как мне реализовать это в LMAX? Я вижу, что когда у меня есть раздел и я помещаю его в RingBuffer, каждый раздел обрабатывается как отдельный элемент, поэтому я присоединяюсь к ним на заказ. что-то типа,

ConcurrentHashMap<Long, LongAdder> map = new ConcurrentHashMap<>();
@Override
public List<SomeTask> score(final List<SomeTask> tasks) {
    long id = tasks.get(0).id;
    map.put(id, new LongAdder());
    for (SomeTask task : tasks) {
        producer.onData(task);
    }
    while (map.get(id).intValue() != tasks.size()) ;
    map.remove(id);
    return tasks;
}

Есть ли чистый способ сделать это? Я посмотрел на https://github.com/LMAX-Exchange/disruptor/tree/master/src/test/java/com/lmax/disruptor/example и KeyedBatching в частности, но они, похоже, объединяются и выполняются в одном потоке.

В настоящее время для меня каждый раздел занимает около 200 мс, и я хотел выполнять их параллельно.

Любая помощь приветствуется.


person jamb    schedule 20.10.2018    source источник


Ответы (1)


Я думаю, вам следует взглянуть на worker-pool , а затем обработчик финальных событий, который повторно объединяет осколки.

person Sam Turtel Barker    schedule 20.11.2018