Когда сотни файлов стартуют одновременно, сервер упирается в память, 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 одной задачи, оставьте резерв системе и подтвердите лимит нагрузочным тестом.

Можно ли обрабатывать файлы параллельно?

Да, но только с ограниченной конкуренцией, независимыми временными файлами и идемпотентным результатом.

Когда стоит обратиться за помощью

Если обработка периодически зависает или повреждает результаты, нужно проверить очередь, файловые блокировки и ресурсы на воспроизводимом пакете.

Итог

Устойчивость массовой обработки достигается контролем потока, а не бесконечным увеличением сервера. Я могу спроектировать очередь, ограничить параллелизм и добавить прозрачные статусы выполнения.