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