Как я могу построить архитектуру Springbatch, чтобы обойти ограничение оракула IN?

Я пытаюсь создать новый проект springbatch, и я просто хочу выполнить эти шаги.

-> read list of accounts Ids (more than 10 000)
--> for each accounts Ids
---> read purchase into database
---> write datas into elasticsearch
  @Bean
  public Job importPurchase(
      JobBuilderFactory jobBuilderFactory, Step findAccountStep, Step importPurchaseStep) {
    return jobBuilderFactory
        .get("importJob")
        .incrementer(new RunIdIncrementer())
        .start(findAccountStep)
        .next(importPurchaseStep)
        .build();
  }

Я создал задание springbatch с двумя шагами и ограничил свой первый фрагмент 1000 элементами (запрос oracle IN ограничен 1000). Но мой первый шаг выполняется 10 раз, а затем начинается второй шаг. Итак, мой список учетных записей содержит 10 000 записей.

Как я могу прочитать свой accountId, а затем получить покупку на 1000 товаров?

Спасибо ! :)

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

  • Читатель считывает идентификаторы учетных записей
  • Процессор обогащает товары деталями покупки
  • Писатель записывает обогащенные элементы в ES

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

Обновлено: Как масштабировать этот шаблон?

Тот же шаблон можно использовать на разделенном входе. Например, разделение 10 000 идентификаторов учетных записей на диапазоны и создание раздела для каждого диапазона. Spring Batch предоставляет образец для этого в ColumnRangePartitioner.

После создания секций вы можете создать секционированный шаг, на котором каждый рабочий процесс применяет шаблон управляющего запроса к назначенной ему секции. Воркеры могут быть локальными потоками или удаленными JVM, что позволяет вам горизонтально масштабировать вашу обработку.

Спасибо за ваш ответ, но в моем случае есть 10 000 идентификаторов учетных записей и, возможно, 300 миллиардов сведений о покупках... Так что я не думаю, что это разумно :/

Jérémy 06.12.2022 08:22

Вы не сообщили этот номер о деталях покупки в своем первоначальном вопросе. Но это не проблема, вы можете использовать тот же шаблон для разделенного ввода, что означает создание разделенного шага (локального или удаленного) и масштабирование обработки по горизонтали по мере необходимости. Я отредактирую вопрос соответственно. Тем не менее, мне любопытно узнать, какую базу данных вы используете для хранения 300 миллиардов сведений о покупках (и как они хранятся), а также какой бизнес, в котором один идентификатор учетной записи может иметь в среднем 30 миллионов сведений о покупках.

Mahmoud Ben Hassine 06.12.2022 08:47

Жаль, что я сделал ошибку. 300 миллионов, а не 300 миллиардов.

Jérémy 06.12.2022 09:28

Другие вопросы по теме