Какое назначение метода, который возвращает GUID операции загрузки
Что проверяют
Узнаёте ли вы за вопросом паттерн асинхронной операции: метод не ждёт окончания долгой загрузки, а сразу отдаёт идентификатор, по которому её потом находят. Следом обычно спрашивают, как клиент узнает о завершении и что будет при повторном запросе.
Как отвечать
Такой метод решает несколько задач сразу:
- развязывает запрос и работу: загрузка большого файла или импорт идут минуты, держать HTTP-запрос открытым столько нельзя. Метод регистрирует операцию и возвращает её
Guid, а работу забирает фоновый обработчик:BackgroundServiceсChannel<T>, очередь брокера, Hangfire; - даёт ручку для статуса: в ASP.NET Core это ответ
202 Acceptedс заголовкомLocationна эндпоинт вида/uploads/{id}, где клиент видит статус, прогресс и ошибку. Вместо опроса можно присылать статус через SignalR; - служит корреляционным идентификатором: один и тот же id попадает в логи, трассировку и сообщения очереди, по нему операцию находят во всех сервисах;
- позволяет сделать повтор безопасным: если клиент присылает свой ключ идемпотентности, повторный запрос возвращает уже созданную операцию, а не запускает вторую загрузку.
GUID удобен тем, что его можно сгенерировать без обращения к базе, на любом узле, без риска коллизий. Guid.NewGuid() даёт случайный UUID версии 4. С .NET 9 есть Guid.CreateVersion7(): значения растут со временем, и в PostgreSQL такой ключ меньше фрагментирует индекс. У SQL Server свой порядок сравнения uniqueidentifier, поэтому там выигрыш нужно проверять отдельно.
Порядок важен: сначала запись операции со статусом Pending сохраняется в хранилище и задача ставится в очередь, и только потом id уходит клиенту.
Где спотыкаются
Отвечают «чтобы id был уникальным». Это свойство GUID, а не назначение метода; интервьюер ждёт асинхронный паттерн и статус.
Считают непредсказуемый GUID защитой. Он не заменяет проверку, что операция принадлежит текущему пользователю, иначе утёкшая ссылка открывает чужой статус и файл.
Возвращают id до сохранения записи. Клиент тут же запрашивает статус и получает 404, а при падении процесса операция теряется бесследно.