Распределенный игровой сервер с использованием торнадо

Мы разрабатываем игровая среда что облегчает изучение «скучного» материала. Недавно мы запустили релиз 1.0, который состоит из следующих модулей:

  1. Веб-портал на основе Django для изучения курсов, просмотра списка лидеров (оценки), личной активности и достижений.
  2. Торнадо в режиме реального времени каналы и службы уведомлений. Мы используем sockjs-торнадо разработан mrjoes. Мы воспользовались общим сеансом: если пользователь зашел на сайт django, он автоматически открыл канал с нашим бэкэндом Comet.
  3. Основанный на торнадо асинхронный многопользовательский игровой сервер. Опять же, мы использовали sockjs-торнадо для подключения и обслуживания игроков (сокетов), синхронизации событий игрового цикла по сети.

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

В случае, если какие-либо действия выполняются на … / игре на сайте Django (действия CRUD), основанный на торнадо Game Router уведомляет в режиме реального времени через своего рода коллекцию оплогов (ограниченная коллекция в mongodb, которая отслеживается Game Router). Если это новая игра, Game Router определяет следующий хост (игровой сервер) для игры по специальному алгоритму (самое быстрое срабатывание пульса или минимальное количество живых (активных) игр). Далее, Game Router уведомляет соответствующий Loop, публикуя сообщение для обмена темой.

В случае сбоя какого-либо игрового сервера, Game Router будет немедленно уведомлен и перебалансирует нагрузку, переместив пустые игры в кластер memcached.

В случае сбоя, как клиент может без проблем подключиться к новому игровому серверу? Я не хочу открывать резервный канал (сокет).
Собираюсь ли я правильно или нет? Пожалуйста, предоставьте мне хорошие подходы, критику, методы. Было бы неплохо, если бы вы поделились своими мыслями, рисуя диаграммы.

Заранее спасибо.введите описание изображения здесь

2

Решение

Пожалуйста, прочитайте диалог между @Rustem и @mrjoes, следуя https://github.com/mrjoes/sockjs-tornado/issues/50

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]