![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Сервер периодически съедает запросы и ничего не отвечает в ответ. Какой-то плавающий баг с серверным софтом. К счастью, нечасто (скажем, один запрос на 20-50 тысяч запросов), но иногда получается заметно, когда от ответа сервера зависит что-нибудь критическое. Понятное дело, у меня возникает исключение IOErrorEvent.
Вопрос, обрабатывает ли кто эту ситуацию и как. Например, если запрос отправлен на сервер и возникла ошибка по таймауту, то отправляем повторно тот же запрос. Или отправляем корректирующий запрос, который сервер обрабатывает иначе. Вариант с вывешиванием транспаранта "Сервер недоступен" мне не очень нравится, поскольку сервер как раз таки работает более-менее нормально, просто потерялся один конкретный запрос. |
|
|||||
|
Лично я сразу еррор пользователю вывожу, чтобы ф5 нажимал, но понятное дело это неправильно, по логике нужно :
1 - послать тело запроса в серверный лог(что-бы потом посмотреть что ни так) 2 - послать его заново. и если 2ой раз прошел еррор, отбросить и предупредить пользователя об ошибке
__________________
Gamedev != Gaming (http://twitter.com/#!/GenzoDev). Don't forget to [+] if it works. |
|
|||||
|
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
С "послать заново" есть проблема. Например, это был запрос на применение зелья. Допустим, запрос дошел до сервера, зелье выпилось, а ответ сервер клиенту не отдал. Второй точно такой же запрос приведет к выпиванию второго зелья.
По идее, должно быть какое-то более общее решение. Что-то типа того, что клиент подписывает свои запросы уникальной подписью для каждого запроса. Если не получил ответ, отправляет точную копию первого запроса с флагом "корректирующий". Сервер, приняв такой запрос, должен как-то проверить, выполнял он уже запрос с такой подписью или нет. Если нет - выполняет и возвращает клиенту ответ. Если выполнял - просто возвращает требуемый ответ. Т.е., для каждого критичного метода на сервере нужно будет дописать его вариант, который не модифицирует данные, а только возвращает результат уже выполненного запроса. |
|
|||||
|
Erlyvideo
|
Думаю, тебе имеет смысл вести номер ревизии наблюдаемого мира.
Клиент послал команду, в которой указал текущую версию мира и ждет следующий номер. Если к серверу приходит запрос с устаревшим номером, то надо отказать клиенту в обслуживании. |
|
|||||
|
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Я как раз сижу на стороне клиента
![]() Проблема не в том, что клиент лупит сервер бессмысленными запросами, а в том, что сервер ничего не отвечает, но при этом возможна как ситуация, что он как раз мир в следующее состояние перевел (просто ничего не отослал клиенту), так и ситуация, когда запрос клиента просто до сервера не дошел. |
|
|||||
|
Регистрация: Jun 2011
Сообщений: 153
|
можно ещё если клиент не дождался ответа от сервера то перезагрузить все переменные как при запуске приложения
|
|
|||||
|
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
По идее, да.
В ряде случаев перезагрузка отдельных данных может помочь. |
|
|||||
|
На клиенте генерируйте ID для каждого запроса, и посылайте вместе с ним, на сервере храните запросы/ответы (временно(на период сессии)) и в случае не получения ответа от сервера, посылайте запрос, что-то вроде (checkRequest) с (ID не полученного запроса) , и сервер либо вернет не полученный ответ либо произведет какие-то действия, ну и все логируйте.
__________________
Gamedev != Gaming (http://twitter.com/#!/GenzoDev). Don't forget to [+] if it works. |
|
|||||
|
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Хранить надо, подозреваю, секунд 40 (в том же мемкеше), или просто хранить для каждого пользователя несколько последних ответов?
|
|
|||||
|
Если у вас не много запросов, не идут всякие запросы на чат и т.п. , храните все запросы пользователя за его сессию, объемы не очень большие да и гибкость, например если у вас есть запрос который выдает один и тот же результат, но при этом производит большие вычисления, вы можете проверить посылал ли пользователь этот запрос, и не делать вычисления а просто выдать ответ. Хранить мне кажется можно как угодно, я бы хранил в базе (при условии, что ответ классифицирован)
__________________
Gamedev != Gaming (http://twitter.com/#!/GenzoDev). Don't forget to [+] if it works. |
![]() |
![]() |
Часовой пояс GMT +4, время: 09:10. |
|
|
« Предыдущая тема | Следующая тема » |
|
|