Как разработать бэкэнд-запрос API, который может занять слишком много времени - PullRequest
0 голосов
/ 15 февраля 2019

Допустим, у меня есть конечная точка API, которая генерирует файл PDF с большим количеством изображений, отправленных клиентом.

Сервер может попытаться оценить, сколько времени займет получение размеров изображений перед их загрузкой,но это не может быть причиной занятых / медленных сетевых скачков.

Итак, очевидно, что сервер просто возвращает сигнал «Текущий» и отправляет электронное письмо или что-то еще, когда файл готов, верно?

Но что, если пользователь отправил очень маленький образец изображений, и отправка электронного письма не нужна?Можно ли с уверенностью это учесть?Может ли сервер рассчитать, что этот файл оказался настолько маленьким, что он определенно может отправить его напрямую, не теряя времени из браузера?

Я новичок в разработке полного стека, но я считаю, что это должно быть распространеновопрос, есть ли имя для этого?
Каковы общие обходные пути и решения для этой проблемы, учитывая, что:

1) Отправка электронной почты пользователю не является идеальным решением

2) Потоковая передача файла во время его создания не являетсявозможно.

3) Обработка должна быть остановлена, если пользователь отказывается / закрывает браузер / теряет соединение / т. д.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Один из вариантов, который мог бы упростить необходимость для вашего клиента иметь дело с различными кодами и форматами ответов, состоит в том, чтобы ваш API возвращал HTTP 202 (Accepted) и возвращал id, который представляет идентификатор ресурса нового PDF.В этом случае API может немедленно ответить и выполнить любую асинхронную обработку, необходимую для создания PDF.Затем клиент может запросить ресурс у вашего API через отдельную конечную точку, такую ​​как GET /pdf/<id>.Если PDF-файл все еще обрабатывается, ваш API будет просто возвращать 404 до его завершения.

Если вы не хотите, чтобы клиент непрерывно опрашивал API, вы можете определить определенный порог времени, который вы ''готовы дождаться отправки письма по умолчанию.Например, запустите таймер сразу после вызова API и начните генерировать PDF, если таймер превысит порог, который вы готовы принять, верните HTTP 202 и при необходимости отправьте электронное письмо после завершения обработки.В случае, если создание PDF заканчивается до порогового значения времени, верните HTTP 2xx с файлом PDF в ответе.

0 голосов
/ 15 февраля 2019

Обнаружение того, что соединение больше не активно, должно быть довольно простым.Так почему бы вам просто не проверить, активно ли соединение, когда вы закончили рендеринг файла, и если оно все еще активно, отправьте его обратно.Если это не так, вы можете отправить файл по электронной почте.Кроме того, если вы находитесь в процессе отправки файла обратно, а время ожидания браузера истекло, просто отправьте файл по электронной почте.

Что касается оценки всех этих вещей, не существует идеальных решений для того, как оценить эти вещи.,Невозможно узнать, использует ли кто-то ваш веб-сайт на своем мобильном телефоне в метро и внезапно входит в туннель, теряя все услуги.

...