Узкое место SpringBatch у ItemProcessor
Мне нужно перенести некоторые данные из одной таблицы в другую, применяя некоторую промежуточную обработку. Обработка является собственностью и предоставляется как услуга REST. Поэтому мне нужно прочитать записи из таблицы, вызвать службы REST, а затем записать обработанную запись в другую таблицу. Как мне реализовать это как Spring Batch, чтобы я мог параллельно выполнять вызовы REST для нескольких записей, потому что именно там я ожидаю много времени для каждой записи? ItemProcessor, где я планирую сделать вызов REST, принимает только один элемент в методе процесса.
2 ответа
Когда обработка является узким местом, вы можете использовать:
AsyncItemProcessor
: это будет обрабатывать элементы асинхронно и может помочь в масштабировании обработки. Подробнее об этом компоненте читайте здесь: https://docs.spring.io/spring-batch/4.0.x/reference/html/spring-batch-integration.htmlУдаленное разделение на блоки: с помощью этой опции масштабируемости вы отправляете данные удаленным работникам для обработки. Это поможет вам масштабировать обработку горизонтально, добавляя больше рабочих по мере необходимости. Подробнее об удаленном разделении на фрагменты в этом разделе: https://docs.spring.io/spring-batch/4.0.x/reference/html/spring-batch-integration.html
Есть несколько важных соображений, на которые вы хотели бы обратить внимание при выборе опции масштабируемости, они подробно описаны здесь: /questions/31068019/raznitsa-mezhdu-podpruzhinennyim-udalennyim-razdeleniem-na-chasti-i-udalennyim-razdeleniem/31068024#31068024
У меня были те же требования, и, как сказал @Mahmoud: Есть несколько хороших подходов:
Удаленное разбиение:
Обработкой и записью занимается рабочий, а чтением — мастер. Мастер должен прочитать, а затем передать рабочие записи по сети.
Удаленное разделение на части на практике
В случае асинхронной обработки, которая позволит вам также масштабировать пакет:
Учебное пособие Spring Batch Integration с использованием асинхронной обработки