Как правильно реализовать сервер для игры?

Здравствуйте, пишу сервер, который будет обслуживать много подключений клиентов. Игра происходит не в реальном времени, клиенту нужно синхронизировать/отправлять данные раз в 10-15 секунд.

Сервер написан на libevent с многопоточностью. База взята была здесь.

Основной вопрос - как правильно держать много подключений? Правильно ли ответить и закрыть подключение, чтобы другие клиенты смогли подключаться дальше.

Попытался проверить нагрузку:

ab -c 1000 -r -t 10 http://127.0.0.1:5555/

И получил
Complete requests: 50000
Failed requests: 101997
(Connect: 0, Receive: 50998, Length: 0, Exceptions: 50999)


Увеличение разрешенного количества дескрипторов не особо улучшила ситуацию.
  • Вопрос задан
  • 2292 просмотра
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Правильно ли ответить и закрыть подключение

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

Как только соединение создано, оно только занимает один дискриптор сокета. И все. У вас могут просто сокеты закончиться свободные, но это решаемая проблема. И все. Больше ресурсов оно не потребляет. А при помощи epoll можно выбирать соединения из общей пачки которые содержат данные на чтение или запись, или которые отвалились... правда я не уверен в контексте libevent, мне казалось что оно это само разруливает.

Так же можно сделать один поток, который принимает соединения и раскидывает их по процессам воркерам. А те уже их обслуживают. Например в nginx каждый процесс-воркер обслуживает свои пачки соединений и разруливает все внутри процесса через тот же epoll. То есть не соединение = процесс, а много соединений = процесс.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы