Масштабування імпорту CSV за допомогою Laravel Job Batching
Клієнти B2B SaaS часто завантажують великі файли. Уявіть собі CSV-файл на 100 000 рядків.
Більшість розробників припускаються помилки. Вони використовують цикл, щоб відправити 100 000 окремих фонових завдань. Це створює проблеми.
Якщо завдання №45 000 завершиться з помилкою, ви не зможете повідомити про це користувача. Ви не зможете відстежувати прогрес. Ви не зможете надіслати один єдиний електронний лист після завершення обробки всього файлу. Ці завдання не пов'язані між собою.
Щоб виправити це, вам потрібен Laravel Job Batching.
Рішення: Bus::batch()
Пакетна обробка завдань (job batching) групує тисячі завдань в одну одиницю. Laravel надає цій одиниці унікальний ID. Ваш фронтенд використовує цей ID для відображення смуги прогресу. Це також надає хуки для обробки успіху або помилки.
Як це реалізувати:
- Використовуйте генератор, безпечний для пам'яті, щоб читати ваш CSV.
- Розбивайте дані на порції (chunks), з якими зручно працювати.
- Використовуйте Bus::batch() для групування завдань.
- Використовуйте allowFailures(), щоб один некоректний рядок не зупиняв увесь процес.
Хуки життєвого циклу працюють так:
- then(): Виконується лише тоді, коли кожне завдання завершиться успішно.
- catch(): Виконується, коли виникає перша помилка.
- finally(): Виконується, коли всі завдання завершені, навіть якщо деякі з них завершилися помилкою.
Перевага для користувачів
Ваш React-фронтенд може опитувати (poll) batch ID. Він відображає смугу прогресу від 0 до 100%. Це перетворює таємниче фонове завдання на прозорий процес.
Інженерна цінність
Ви отримуєте контроль над розподіленими завданнями. Ви запобігаєте прихованим помилкам. Ви надаєте користувачам дані в режимі реального часу. Ви гарантуєте, що логіка постобробки запуститься у правильний час.
Джерело: https://dev.to/iprajapatiparesh/scaling-csv-imports-master-laravel-job-batching-iaa