Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Обработка потерянных запросов (http://www.flasher.ru/forum/showthread.php?t=171095)

mikhailk 08.11.2011 19:12

Обработка потерянных запросов
 
Сервер периодически съедает запросы и ничего не отвечает в ответ. Какой-то плавающий баг с серверным софтом. К счастью, нечасто (скажем, один запрос на 20-50 тысяч запросов), но иногда получается заметно, когда от ответа сервера зависит что-нибудь критическое. Понятное дело, у меня возникает исключение IOErrorEvent.

Вопрос, обрабатывает ли кто эту ситуацию и как. Например, если запрос отправлен на сервер и возникла ошибка по таймауту, то отправляем повторно тот же запрос. Или отправляем корректирующий запрос, который сервер обрабатывает иначе. Вариант с вывешиванием транспаранта "Сервер недоступен" мне не очень нравится, поскольку сервер как раз таки работает более-менее нормально, просто потерялся один конкретный запрос.

Genzo 08.11.2011 19:20

Лично я сразу еррор пользователю вывожу, чтобы ф5 нажимал, но понятное дело это неправильно, по логике нужно :
1 - послать тело запроса в серверный лог(что-бы потом посмотреть что ни так)
2 - послать его заново. и если 2ой раз прошел еррор, отбросить и предупредить пользователя об ошибке

mikhailk 08.11.2011 19:32

С "послать заново" есть проблема. Например, это был запрос на применение зелья. Допустим, запрос дошел до сервера, зелье выпилось, а ответ сервер клиенту не отдал. Второй точно такой же запрос приведет к выпиванию второго зелья.

По идее, должно быть какое-то более общее решение. Что-то типа того, что клиент подписывает свои запросы уникальной подписью для каждого запроса. Если не получил ответ, отправляет точную копию первого запроса с флагом "корректирующий". Сервер, приняв такой запрос, должен как-то проверить, выполнял он уже запрос с такой подписью или нет. Если нет - выполняет и возвращает клиенту ответ. Если выполнял - просто возвращает требуемый ответ. Т.е., для каждого критичного метода на сервере нужно будет дописать его вариант, который не модифицирует данные, а только возвращает результат уже выполненного запроса.

maxlapshin 08.11.2011 19:49

Думаю, тебе имеет смысл вести номер ревизии наблюдаемого мира.
Клиент послал команду, в которой указал текущую версию мира и ждет следующий номер.
Если к серверу приходит запрос с устаревшим номером, то надо отказать клиенту в обслуживании.

mikhailk 08.11.2011 19:54

Я как раз сижу на стороне клиента :)

Проблема не в том, что клиент лупит сервер бессмысленными запросами, а в том, что сервер ничего не отвечает, но при этом возможна как ситуация, что он как раз мир в следующее состояние перевел (просто ничего не отослал клиенту), так и ситуация, когда запрос клиента просто до сервера не дошел.

DJDrugsounD 08.11.2011 20:26

можно ещё если клиент не дождался ответа от сервера то перезагрузить все переменные как при запуске приложения

mikhailk 08.11.2011 20:42

По идее, да.
В ряде случаев перезагрузка отдельных данных может помочь.

Genzo 09.11.2011 10:58

На клиенте генерируйте ID для каждого запроса, и посылайте вместе с ним, на сервере храните запросы/ответы (временно(на период сессии)) и в случае не получения ответа от сервера, посылайте запрос, что-то вроде (checkRequest) с (ID не полученного запроса) , и сервер либо вернет не полученный ответ либо произведет какие-то действия, ну и все логируйте.

mikhailk 09.11.2011 12:12

Хранить надо, подозреваю, секунд 40 (в том же мемкеше), или просто хранить для каждого пользователя несколько последних ответов?

Genzo 09.11.2011 13:02

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


Часовой пояс GMT +4, время: 10:06.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.