TCP Python Server
У меня есть вопрос относительно надежности соединения при запуске tcp-сервера из экземпляра ec2.
В настоящее время мы обслуживаем мобильных пользователей по всему миру из региона Орегон, используя экземпляр c3.4xl ec2. Наш продукт представляет собой живой игровой сервер, написанный на python с использованием фреймворка Gevent. В настоящее время мы обслуживаем около 200 - 300 клиентов одновременно.
Проблема в том, что у нас много клиентов из другой части мира, которые испытывают проблемы с подключением и сохранением связи с сервером. Сервер последовательно имеет время ожидания клиентов без закрытия сокета. Мы наблюдаем времена> 30-х годов, не слыша в ответ от сердцебиения.
Разве это неправильно с нашей стороны предполагать, что мобильный клиент может установить долгосрочное tcp-соединение со всего мира и не прервать его?
Если это так, что будет лучшим способом смягчить эту проблему?
Если нет, есть ли у кого-нибудь стратегии отладки потерянных соединений?
Заранее спасибо:)
2 ответа
Да, очень неправильно предполагать, что TCP будет полностью надежным. Вам необходимо разработать приложение с учетом отказоустойчивости. TCP сломается, истечет время ожидания, и в противном случае будет вести себя плохо, учитывая огромное количество клиентских устройств.
То, как вы это исправите, во многом зависит от вашего приложения и совершенно не по теме серверной ошибки. Возможно, вам повезет больше с переполнением стека или обменом стека Gamedev.
Раскрутите экземпляр micro или m1.small в регионе AWS рядом с вашими конечными пользователями, на котором установлен HAProxy.
Сконфигурируйте прокси в режиме TCP для прослушивания на соответствующем порту и ретрансляции подключений к Oregon.
Прокси фактически будет управлять 2 отдельными соединениями для каждого сеанса, по одному в каждом направлении (от пользователя и к вашему серверу), и вы можете обнаружить, что эта настройка помогает стабилизировать ситуацию. Прокси-сервер будет прослушивать соединения, и каждый раз, когда он входит, он создает отдельное соединение, исходящее к вашему серверу. Как только будет установлено это соединение, прокси-сервер будет слепо связывать каналы данных из этих соединений и удерживать соединения до тех пор, пока один конец или другой не прервется, или пока не истечет внутренний таймер простоя прокси-сервера, который также закроет соединения, так что вы возможно, потребуется увеличить время ожидания от значений по умолчанию.
Теоретически это не должно иметь значения, но на практике качество и надежность соединений между пользователями и прокси-сервером - и между прокси-сервером и вашим главным сервером - может быть намного лучше, чем "прямые" соединения, что делает конечную сквозная связь более надежна.
Вы должны обнаружить, что HAProxy может обрабатывать сотни одновременных соединений на очень маленьком сервере. Это не единственный инструмент для этого приложения, но тот, с которым я больше всего знаком.