Стоит ли держать HTTP-запрос, пока сервер выполняет трудоемкую операцию?Или отпустить запрос? - PullRequest
1 голос
/ 28 сентября 2011

Допустим, операция может занять от 2 до 10 минут на сервере, например, для обновления индекса, который занимает много времени.

Вы бы выполнили операцию, удерживая запрос?т.е. не отправлять HTTP-ответ до завершения операции?А если клиент / браузер отбрасывает запрос, все равно продолжить работу?

Какая альтернатива?Чтобы запустить операцию, и ответ с «продолжительной операцией начался»?Что если операция потерпит неудачу на полпути, как клиент узнаетПоддерживать «статус» операции на стороне сервера?

Спасибо

Ответы [ 3 ]

3 голосов
/ 28 сентября 2011

Вы также можете использовать фрагментарный ответ. Во-первых, нажмите на чанк с кодом, который будет отображать экран «пожалуйста, подождите», очистите ответ и начните работу. Затем вы можете либо толкать и сбрасывать куски с периодическими обновлениями прогресса, либо просто нажимать один в конце с «заполненной» информацией. Очевидно, что вы можете использовать JavaScript, чтобы получить хороший интерфейс.

(Вышеприведенное неприменимо, если вы используете WSGI, так как первая спецификация WSGI написана таким образом, что блокирует использование ответов неизвестной длины, поэтому использование фрагментированных ответов невозможно).

2 голосов
/ 28 сентября 2011

Для запросов, о которых вы знаете, потребуется много времени (более нескольких секунд), вы должны как минимум предположить, что соединение может быть принудительно разорвано брандмауэром.

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

0 голосов
/ 28 сентября 2011

Вы бы выполнили операцию, удерживая запрос? т.е. не отправлять HTTP-ответ до завершения операции?

Чего ожидают ваши пользователи?

А если клиент / браузер отбросит запрос, просто все равно продолжите операцию?

Чего ожидают ваши пользователи?

Какая альтернатива? Чтобы запустить операцию, и ответ с «продолжительной операцией начался»?

Что еще вы могли бы сделать? Игнорировать запрос? Притворись, что этого не произошло? Очевидно, вы сообщите им.

Что если операция не удастся на полпути, как клиент узнает? Поддерживать серверный «статус» операции?

Какая альтернатива этому? Магия? Интуиция? Очевидно, вы должны сохранить статус. И отобразить статус.

Читайте о сельдерея .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...