Отключение/таймаут HTTP между обработкой запроса и ответа

Предположим следующее:

  • Клиент отправляет HTTP-сообщение на сервер
  • Запрос действителен и были обработаны сервером. Данные были вставлены в базу данных.
  • Веб-приложение отвечает на запрос клиента
  • Клиент встречает тайм-аут и не видит ответа HTTP.

В этом случае мы встречаем ситуацию, когда: - клиент не знает, были ли его данные действительными и правильно вставлены - веб-сервер (приложение rails 3.2) не показывает никакого исключения, независимо от того, находится ли он за прокси-сервером apache или нет

Я не могу найти, как обрабатывать такой сценарий в документации по HTTP. Мой вопрос:

a) должен ли клиент ожидать, что его данные МОГУТ быть обработаны уже? (так что попробуйте, например, GET-запрос, чтобы проверить, были ли данные отправлены)

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

Ответ 1

HTTP - это протокол без учета состояния. Это означает, что по определению вы не можете знать на стороне клиента, что http -верб POST преуспел или нет.

Существуют некоторые методы, которые веб-приложения используют для преодоления этой функции HTTP. Они включают.

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

Есть действительно отличная цитата, что я прошу прощения в бессонные ночи:

"Веб-запрос - это страшное место, вы хотите быстро и быстро войти как вы можете" - Рик Брэнсон

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

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

Примером "серьезной обработки" может быть некоторая загрузка изображения, возможно, с некоторой обработкой изображений после загрузки. Примером решения задачи и очередности будет: RabbitMQ и Celery

Примерное решение вашей проблемы:

  • вставьте часть ваших данных в dbms (или даже быстрее NoSQL)
  • передать дорогостоящую обработку фоновой задаче.
  • вернуться к пользователю/веб-клиенту. (даже в фоновом режиме задача все еще работает)
  • прослушать окончательный ответ с помощью (опроса, потоковой передачи или веб-сайтов). Этот шаг не является тривиальной задачей, но конечный результат стоит того.

Затяните этот веб-запрос, и это будет редкий день, когда ваш клиент не получит ответ.

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

Этот ответ охватывает некоторые из методов опроса/потоковой передачи/веб-макетов, которые вы можете использовать.

Ответ 2

Вы можете обработать это с помощью ajax и jQuery, как описано ниже:

Полный

Тип: Функция (jqXHR jqXHR, String textStatus)

Функция, вызываемая при завершении запроса (после успешного выполнения и обратных вызовов ошибок). Функция получает два аргумента: объект jqXHR (в jQuery 1.4.x, XMLHTTPRequest) и строка, классифицирующая статус запроса ( "успех", "немодифицированный", "ошибка", "тайм-аут" , "abort" или "parsererror" ).

JQuery ajax API

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