Как происходит запрос на обработку файла
Что проверяют
Хотят услышать, как у вас в проекте устроен путь файла от запроса до результата и где в нём узкие места: память, время, безопасность. Следом обычно спрашивают, что будет, если пришёл файл на 2 ГБ или обработка занимает минуты.
Как отвечать
Рассказывайте на примере своего сервиса, но держите каркас:
- приём: ограничьте тело через
http.MaxBytesReader, иначе клиент зальёт сколько угодно.r.ParseMultipartForm(32 << 20)держит в памяти до указанного объёма, остальное пишет во временные файлы. Для больших файлов лучшеr.MultipartReader()и потоковое чтение частей; - сохранение:
io.Copyиз части сразу в файл или в объектное хранилище, безio.ReadAll. Тип проверяйте по содержимому черезhttp.DetectContentTypeпо первым 512 байтам, а не по расширению; - обработка: если она быстрая, делайте её в обработчике с учётом
r.Context(): клиент отвалился, работа отменяется. Если долгая, отвечайте202 Acceptedс идентификатором задачи и кладите задачу в очередь (Kafka, RabbitMQ, NATS или таблица в Postgres). Воркеры забирают её с ограниченной параллельностью, например черезerrgroupсSetLimit; - статус: клиент узнаёт результат опросом по идентификатору, через вебхук или WebSocket;
- надёжность: идемпотентность по ключу файла, повторы с backoff, таймауты на каждый внешний вызов.
Если опыт у вас был проще, например синхронная обработка небольших CSV, скажите об этом прямо и объясните, что поменяли бы при росте объёмов. Это звучит лучше, чем выдуманная очередь, по которой вас тут же начнут расспрашивать.
Где спотыкаются
Открывают файл по имени из запроса, os.Open(r.URL.Query().Get("file")). Это классический path traversal через ../../etc/passwd. Имя нужно проверять, а доступ ограничивать каталогом, в Go 1.24 для этого появился os.Root.
Читают весь файл в память. Пара параллельных загрузок крупных файлов, и контейнер падает по OOM.
Запускают на каждый файл голую go process(f) без ограничения параллельности и без recover. Под нагрузкой это тысячи горутин, а паника в любой из них роняет весь процесс: net/http перехватывает панику только в самом обработчике.