Масштабирование импорта CSV с помощью Laravel Job Batching

B2B SaaS клиенты часто загружают большие файлы. Представьте себе CSV-файл со 100 000 строк.

Большинство разработчиков совершают ошибку. Они используют цикл, чтобы отправить 100 000 отдельных фоновых задач. Это создает проблемы.

Если задача №45 000 завершится с ошибкой, вы никак не сможете сообщить об этом пользователю. Вы не сможете отслеживать прогресс. Вы не сможете отправить одно письмо по завершении обработки всего файла. Задачи никак не связаны друг с другом.

Чтобы решить эту проблему, вам понадобится Laravel Job Batching.

The Solution: Bus::batch()

Пакетная обработка (job batching) объединяет тысячи задач в единое целое. Laravel присваивает этому блоку уникальный ID. Ваш фронтенд использует этот ID для отображения индикатора выполнения (progress bar). Также предусмотрены хуки для обработки успеха или ошибки.

How to implement it:

  • Используйте генератор, безопасный с точки зрения использования памяти, для чтения CSV.
  • Разбейте данные на управляемые части (chunks).
  • Используйте Bus::batch() для группировки задач.
  • Используйте allowFailures(), чтобы одна некорректная строка не останавливала весь процесс.

The lifecycle hooks work like this:

  • then(): Выполняется только в том случае, если все задачи завершились успешно.
  • catch(): Выполняется при возникновении первой ошибки.
  • finally(): Выполняется после завершения всех задач, даже если некоторые из них завершились с ошибкой.

The Benefit for Users

Ваш фронтенд на React может опрашивать (poll) batch ID. Это позволяет отображать индикатор прогресса от 0 до 100%. Таким образом, таинственная фоновая задача превращается в прозрачный и понятный процесс.

The Engineering Value

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

Source: https://dev.to/iprajapatiparesh/scaling-csv-imports-master-laravel-job-batching-iaa