Как найти причину плохого соединения TCP - PullRequest
5 голосов
/ 09 февраля 2012

Мы разрабатываем онлайн-игру, в которой игроки общаются с сервером через постоянное TCP-соединение. Постоянно, как и в, время его жизни соответствует сеансу игрока, и если соединение закрыто, игрок выбрасывается из игры (хотя клиент попытается автоматически восстановить соединение).

Проблема

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

Вопрос

Как я могу узнать причину этих отключений? Это потому что:

  • У игроков плохое интернет-соединение, и с этим ничего не поделаешь.
  • Расстояние между игроками и сервером (Турция <-> Нидерланды) слишком велико.
  • Что-то не так с сервером (машиной CentOS) или центром обработки данных.
  • Сервер перегружен (хотя это происходит и при низких нагрузках).
  • В нашем программном обеспечении произошла ошибка.
  • Или какая-то другая причина?

Программное обеспечение написано на Java. Он регистрирует, когда игроки отключены, и если он активно их пинает (например, не отправляет сообщения keep-alive), он также регистрирует это.

Известные данные

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

Другие

Есть много других онлайн-игр, подобных нашей. Как они справляются с этим? (Если проблема не в сервере / центре обработки данных, решение очевидно)

  • Они используют UDP? Я знаю, что экшн-игры делают, для скорости, но я предполагаю, что TCP нормально для, например. онлайн покер и другие медленные игры? (Не то чтобы это помогло нам, наше клиентское программное обеспечение сделано во Flash, который не поддерживает UDP)
  • Есть ли какая-нибудь подстройка TCP, чтобы сделать его более мягким?
  • Или они тоже получают эти разъединения, просто более прозрачно подключаются?
  • Есть ли информация об этом в сети?

1 Ответ

1 голос
/ 10 февраля 2012

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

Оттуда, что вам понадобится, когда произойдет отключение, будет довольно подробный журнал.Когда происходит отключение, перехватите любое исключение (и не забудьте также записать причину с помощью вызова на .getCause() - сделать столько же вызовов на .getCause(), скольконеобходимо до тех пор, пока вы не войдете полностью в исходную причину), а также любые соответствующие данные, необходимые для сопоставления журнала клиента с журналами на стороне сервера.Скорее всего, вам понадобится информация, такая как идентификаторы сеанса, игровые идентификаторы, временные метки и т. Д. Просто подумайте: «Какая информация, по-моему, мне понадобится для устранения этой проблемы, если предположить, что я получил представление об обеих сторонах соединения?это то, что вы в конечном итоге получите, попросив пользователей загружать данные об использовании и отладке.

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

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

...