Мультиплеер для онлайн игры (HTML5/JS/AS3)?

Здравствуйте.

Необходимо реализовать мультиплеер для нескольких настольных и мобильных онлайн игр. Игры разработаны на HTML5/JavaScript/ActionScript 3. Никакой сверхсложной синхронизации и риалтайма на стороне сервера не нужно. Так как игры относительно простые (например, дурак/нарды/шахматы/балда), то нужно реализовать что-то вроде игровых комнат/столов с количеством игроков от 2 до 10-15 (не больше) + текстовый чат.

В каждой игровой комнате один из игроков делает какое-нибудь действие/ход, а все остальные должны ждать в это время + должна быть общая синхронизация (обновление) между игроками так, чтобы каждый игрок в комнате увидел у себя, как походил текущий активный игрок и что произошло в это время. Также необходимо реализовать контроль входа/выхода игроков из комнат.

Главные требования - максимальная простота, возможность масштабирования и высокие нагрузки. Не хочется создавать еще один велосипед с использованием UDP/сокетов на C++/Java. На данный момент решение вижу следующим образом. Основная информация о пользователях (логины/пароли/баланс/уровень и т.п.) будет хранится в БД MySQL+репликация на несколько серверов. Вся информация о игровых комнатах будет хранится в in-memory хранилищах типа Redis (для быстроты доступа). Данные от клиентов будут приходить через протокол HTTP в виде JSON. Для обработки HTTP запросов будет NGINX + PHP/Python. Клиенты будут обновлять игровое поле/комнату/стол регулярно отправляя на сервер запросы к API (возможно Long Polling). Сервер будет проверять состояние игровой комнаты в Redis и обновлять состояние/передавать управление/ход следующему игроку.

Посоветуйте, пожалуйста, как более правильно реализовать все это с точки зрения архитектуры/оптимизации нагрузки на сервер и масштабирования. Понимаю, что полностью готового решения нет, поэтому буду рад услышать любые советы/ссылки/фреймворки/библиотеки/опыт других людей для менее болезненного написания сервера.

Особенно интересен опыт разработчиков мультиплеерных социальных и мобильных игр (не Unity3D).

Приоритетные языки и технологии: HTML5, JS, AS3, MySQL, Redis, Memcached, PHP, Python, Java.

Спасибо.
  • Вопрос задан
  • 5969 просмотров
Решения вопроса 1
littleguga
@littleguga
Не стыдно не знать, а стыдно не интересоваться.
Если Вы говорите, что часть клиентов уже сделана на html5/JS, то вообще самое простое будет взять: socket.io и поднять сервер на nodejs с тем же socket.io только в качестве сервера. Данные также в БД + кэш рэдиса. Особенно больше ничего и не надо.

+ посмотрите в сторону ionic framework, позволяет обернуть web-приложение в нативное на мобильные платформы, если игры не нагружены анимацией, то вполне достойный вариант.

И в итоге получается Вам надо сделать 1 клиент на js+socket.io, на веб просто загрузить его, а на мобилках обернуть в ionic. И сделать сервер, который будет создавать комнаты и принимать новые подключения.

PHP плохо подходит, так как в нем довольно больно реализовать нормальное взаимодействие через сокеты/long-polling для работы с комнатами.

upd:
Думаю будет полезно посмотреть:
github/node-js-game-server
npm/nodegame
Building Multiplayer Games with Node.js and Socket.IO
Dynamically Creating Game Rooms using Socket.IO an...

upd2:
По поводу нагрузки:
socket.io benchmark
1 миллион коннектов на 15ГБ оперативки
600к подключений
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
akubintsev
@akubintsev
Опытный backend разработчик
Проблема не столько в выборе инструментов, сколько в разработке архитектуры, способной на горизонтальное масштабирование.
Нет никакой особой сложности сделать задуманное на php/python и даже perl взаимодействие через (веб-)сокеты. Преимущество node.js разве что в асинхронной работе с хранилищами из коробки, но это не означает еще, что сразу будет быстрее.
От себя бы порекомендовал использовать не MySQL, а PostgreSQL. Надежнее и как минимум не медленнее.
БД надо сразу шардировать. Как минимум шарды под пользователе-зависимую информацию.
Скорее всего также придётся написать прокси для раскидывания юзеров по разным гейм-серверам.
В общем, по хорошему нужен хотя бы сениор с опытом боевого геймдева.
Ответ написан
Комментировать
@spotifi
Если речь идет действительно о большом масштабировании, то см. в сторону микросервисной архитектуры.

SQL плохо масштабируется горизонтально (добавлением серверов).

Рассмотрел бы отказ от MySQL в пользу MongoDB, например, она умеет горизонтально масштабироваться.
Рассмотрел бы отказ от БД вообще в пользу Tarantool. Если оперативной памяти хватает держать всю БД в ней, то это радикально быстрее.

Клиенты будут обновлять игровое поле/комнату/стол регулярно отправляя на сервер запросы к API (возможно Long Polling).


В наше время это не круто и по ресурсам в том числе. Я бы рассмотрел вариант websocket для новых клиентов и long polling для старых.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы