Параллельная обработка верблюдов произвольно пропускает индексы

#java #parallel-processing #apache-camel

Вопрос:

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

В начале маршрута мы используем многоадресную рассылку для отправки запроса в несколько разных систем, один из этих новых маршрутов затем разделит тело, чтобы продолжить маршрут, а затем приступит к выполнению фактического запроса.

Многоадресная рассылка и разделение выглядят так (в разных точках маршрута, конечно):

 .multicast(new ParallelStrategy()).streaming().parallelProcessing().executorService(poolSplitter)
 
 .split(simple("${body}"), new ParallelStrategy()).streaming().parallelProcessing()
 

При тестировании кода мы заметили, что иногда отклик этого маршрута не был ожидаемым, по-видимому, он пропускал некоторые индексы после разделения.
Чтобы проверить это, я сделал довольно простой журнал, в котором я распечатывал CamelSplitIndex прямо на разделении и снова печатал в конце маршрута, делая это, я обнаружил, что некоторые потоки прямо игнорировали части кода.

Например, это разделение в начале:

 [0, 1, 2, 3, 4, 6, 5, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 32, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74]
 

Превратился в это в конце:

 [0, 8, 7, 4, 2, 1, 9, 6, 3, 5, 10, 12, 14, 18, 17, 15, 11, 13, 19, 16, 20, 21, 24, 29, 26, 22, 30, 28, 32, 33, 31, 27, 25, 34, 35, 36, 37, 38, 41, 39, 40, 42, 46, 43, 47, 48, 44, 51, 45, 50, 49, 52, 55, 53, 57, 54, 58, 56, 59, 60, 62, 61, 65, 69, 64, 67, 68, 66, 70, 71, 63, 72, 73, 74]
 

Если вы посмотрите внимательно, вы обнаружите, что в самом начале индексы 8 и 45 не были напечатаны в самом начале, что выглядело бы так, как будто эти потоки даже не начинались, но в конце вы можете видеть, что они действительно были напечатаны, а это означает, что код, который должен был быть напечатан в начале, был проигнорирован, но поток тем не менее продолжал выполняться.

Вы также увидите, что индекс 23 начался и никогда не заканчивался, он также не выдавал никаких ошибок, поэтому я бы поспорил, что он также был проигнорирован.

Я могу выделить, что проблема заключается в «.parallelProcessing ()», так как, когда я удаляю его, код работает нормально, но этот маршрут довольно тяжелый, поэтому мне действительно нужно сделать эту параллель, чтобы она работала с хорошей производительностью.

Вопрос в том, существует ли какая-либо конфигурация для параллельной обработки, которой мне не хватает? является ли это ожидаемым поведением? есть ли какие-либо другие способы избежать этой проблемы? и так далее…

На данный момент я попытался работать с некоторыми другими функциями Camel, такими как «.threads()» или «.streaming ()», но ни одна из них, похоже, не работала. Я также попытался использовать стандартные классы Java для запуска, чтобы заменить параллелизм Camel, но он становится очень сложным, и его будет трудно поддерживать и масштабировать, поэтому мои коллеги сказали, что это не поможет.