Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Серверные технологии и Flash

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 08.11.2011, 19:12
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 1  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
По умолчанию Обработка потерянных запросов

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

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

Старый 08.11.2011, 19:20
Genzo вне форума Посмотреть профиль Отправить личное сообщение для Genzo Посетить домашнюю страницу Genzo Найти все сообщения от Genzo
  № 2  
Ответить с цитированием
Genzo
 
Аватар для Genzo

блогер
Регистрация: Feb 2010
Адрес: MSK
Сообщений: 859
Записей в блоге: 3
Отправить сообщение для Genzo с помощью ICQ Отправить сообщение для Genzo с помощью Skype™
Лично я сразу еррор пользователю вывожу, чтобы ф5 нажимал, но понятное дело это неправильно, по логике нужно :
1 - послать тело запроса в серверный лог(что-бы потом посмотреть что ни так)
2 - послать его заново. и если 2ой раз прошел еррор, отбросить и предупредить пользователя об ошибке
__________________
Gamedev != Gaming (http://twitter.com/#!/GenzoDev). Don't forget to [+] if it works.

Старый 08.11.2011, 19:32
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 3  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
С "послать заново" есть проблема. Например, это был запрос на применение зелья. Допустим, запрос дошел до сервера, зелье выпилось, а ответ сервер клиенту не отдал. Второй точно такой же запрос приведет к выпиванию второго зелья.

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

Старый 08.11.2011, 19:49
maxlapshin вне форума Посмотреть профиль Отправить личное сообщение для maxlapshin Найти все сообщения от maxlapshin
  № 4  
Ответить с цитированием
maxlapshin
Erlyvideo

Регистрация: Aug 2008
Сообщений: 197
Отправить сообщение для maxlapshin с помощью ICQ
Думаю, тебе имеет смысл вести номер ревизии наблюдаемого мира.
Клиент послал команду, в которой указал текущую версию мира и ждет следующий номер.
Если к серверу приходит запрос с устаревшим номером, то надо отказать клиенту в обслуживании.

Старый 08.11.2011, 19:54
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 5  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Я как раз сижу на стороне клиента

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

Старый 08.11.2011, 20:26
DJDrugsounD вне форума Посмотреть профиль Отправить личное сообщение для DJDrugsounD Найти все сообщения от DJDrugsounD
  № 6  
Ответить с цитированием
DJDrugsounD
 
Аватар для DJDrugsounD

Регистрация: Jun 2011
Сообщений: 153
можно ещё если клиент не дождался ответа от сервера то перезагрузить все переменные как при запуске приложения

Старый 08.11.2011, 20:42
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 7  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
По идее, да.
В ряде случаев перезагрузка отдельных данных может помочь.

Старый 09.11.2011, 10:58
Genzo вне форума Посмотреть профиль Отправить личное сообщение для Genzo Посетить домашнюю страницу Genzo Найти все сообщения от Genzo
  № 8  
Ответить с цитированием
Genzo
 
Аватар для Genzo

блогер
Регистрация: Feb 2010
Адрес: MSK
Сообщений: 859
Записей в блоге: 3
Отправить сообщение для Genzo с помощью ICQ Отправить сообщение для Genzo с помощью Skype™
На клиенте генерируйте ID для каждого запроса, и посылайте вместе с ним, на сервере храните запросы/ответы (временно(на период сессии)) и в случае не получения ответа от сервера, посылайте запрос, что-то вроде (checkRequest) с (ID не полученного запроса) , и сервер либо вернет не полученный ответ либо произведет какие-то действия, ну и все логируйте.
__________________
Gamedev != Gaming (http://twitter.com/#!/GenzoDev). Don't forget to [+] if it works.

Старый 09.11.2011, 12:12
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 9  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Хранить надо, подозреваю, секунд 40 (в том же мемкеше), или просто хранить для каждого пользователя несколько последних ответов?

Старый 09.11.2011, 13:02
Genzo вне форума Посмотреть профиль Отправить личное сообщение для Genzo Посетить домашнюю страницу Genzo Найти все сообщения от Genzo
  № 10  
Ответить с цитированием
Genzo
 
Аватар для Genzo

блогер
Регистрация: Feb 2010
Адрес: MSK
Сообщений: 859
Записей в блоге: 3
Отправить сообщение для Genzo с помощью ICQ Отправить сообщение для Genzo с помощью Skype™
Если у вас не много запросов, не идут всякие запросы на чат и т.п. , храните все запросы пользователя за его сессию, объемы не очень большие да и гибкость, например если у вас есть запрос который выдает один и тот же результат, но при этом производит большие вычисления, вы можете проверить посылал ли пользователь этот запрос, и не делать вычисления а просто выдать ответ. Хранить мне кажется можно как угодно, я бы хранил в базе (при условии, что ответ классифицирован)
__________________
Gamedev != Gaming (http://twitter.com/#!/GenzoDev). Don't forget to [+] if it works.

Создать новую тему Ответ Часовой пояс GMT +4, время: 09:10.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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