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

Допустим, простая браузерная викторина. По WebSocket подключаются к серверу и отправляют ответы.
Игра на время. У всех появился вопрос, 10 секунд на раздумья и выбор варианта ответа.
Сервер приинял ответы, разослал всем статистику: вариант А: 100 человек, вариант Б: 200.

Просто, пока не ломится туда по 100 тыс. участников. Приходится масштабировать.

Несколько серверов. Каждый обслуживает свой пул WS-соединений == пул игроков.
Данные игроков — только в памяти этого сервера.

Закончилось время вопроса. Надо собрать общую статистику между всеми серверами и отправить каждый своим игрокам.

Какой паттерн (?) есть для этой ситуации?

Пришло в голову пока 2 варианта.
  1. Серверы полностью одинаковы и равноправны. Знают контакты остальных. Каждый шлёт остальным свои данные, ждёт (определённое время?) от остальных их инфу. Суммирует, рассылает по своему пулу.
  2. Мастер-сервер и «рабы». Мастер собирает со всех инфу, у себя суммирует, отправляет по всем итог. Те рассылают по пулу.

Какой из вариантов лучше и почему, как считаете?
  • Вопрос задан
  • 100 просмотров
Решения вопроса 1
gbg
@gbg
Баянист. Тамада. Услуги.
Однослойная структура, теоретически, может быть более устойчива, чем структура с выделенным сервером.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
sgjurano
@sgjurano
Разработчик
Скорее всего для такой задачи хватит одного сервера за глаза.

Если понадобится масштабировать, то сделаете несколько одинаковых машин с общей базой и балансер перед ними.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
1. Отправка ответов на вопросы - через POST.
2. Получение серверных событий браузером (новый вопрос, синхр.таймера, кто онлайн?) - websocket.
3. Остальное - GET.
Ответ написан
Ваш ответ на вопрос

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

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