Когда сотни файлов стартуют одновременно, сервер упирается в память, CPU, диск или лимиты внешнего сервиса. Увеличение ресурсов может отсрочить падение, но не исправляет отсутствие управления параллелизмом.
Переведите обработку в очередь и задайте измеримый лимит worker. Каждый файл должен иметь собственный статус, идемпотентный ключ и возможность безопасного повтора.
Что сделать в первую очередь
- Определите пиковое число одновременно запущенных процессов.
- Измерьте память, CPU, I/O и время одного типового файла.
- Найдите механизм, который запускает весь пакет без лимита.
- Сохраните список файлов, завершившихся частично или с ошибкой.
Почему возникает проблема
Падение появляется из-за неограниченного fan-out и отсутствия обратного давления.
- Каждый загруженный файл немедленно создаёт отдельный процесс.
- Worker загружает большой файл целиком в память.
- Несколько задач пишут в одно временное имя.
- Повтор запускает уже выполненный файл повторно.
- Внешний API ограничивает частоту запросов.
Пошаговая диагностика
- Постройте график потребления ресурсов по числу worker.
- Проверьте уникальность временных каталогов.
- Сопоставьте OOM, exit code и статус задач.
- Проверьте ack задания только после завершения файла.
- Испытайте пакет из малых, больших и повреждённых файлов.
Как исправить
Система должна принимать большой пакет быстро, но выполнять его с контролируемой скоростью.
- Помещайте задания в устойчивую очередь.
- Ограничьте concurrency по доступной памяти и CPU.
- Обрабатывайте файлы потоково, если формат позволяет.
- Используйте уникальный рабочий каталог и атомарное перемещение результата.
- Настройте ограниченные повторы с dead-letter очередью.
Как проверить результат
- Пакет больше обычного не выводит сервер за лимиты.
- Повреждённый файл не останавливает остальные.
- Повтор задания не создаёт дубликат результата.
- Панель показывает queued, running, done и failed.
Как не допустить повторения
- Добавьте мониторинг длины очереди и возраста старейшей задачи.
- Ограничьте размер и тип файла до постановки в очередь.
- Регулярно очищайте временные каталоги по безопасному правилу.
- Проводите нагрузочный тест перед изменением лимита worker.
Чего не стоит делать
- Не запускайте по процессу на каждый файл без верхней границы.
- Не увеличивайте memory_limit вместо потоковой обработки.
- Не удаляйте исходник до подтверждения готового результата.
Что подготовить для диагностики
- Размеры и форматы типового пакета.
- Графики ресурсов в момент падения.
- Журнал worker и exit code.
- Текущая схема запуска и хранения статусов.
Частые вопросы
Как выбрать число worker?
Измерьте пиковую память и CPU одной задачи, оставьте резерв системе и подтвердите лимит нагрузочным тестом.
Можно ли обрабатывать файлы параллельно?
Да, но только с ограниченной конкуренцией, независимыми временными файлами и идемпотентным результатом.
Когда стоит обратиться за помощью
Если обработка периодически зависает или повреждает результаты, нужно проверить очередь, файловые блокировки и ресурсы на воспроизводимом пакете.
Итог
Устойчивость массовой обработки достигается контролем потока, а не бесконечным увеличением сервера. Я могу спроектировать очередь, ограничить параллелизм и добавить прозрачные статусы выполнения.