Как реализовать backend realtime-игры с «ведущим» игру процессом?
Нужно сделать realtime-приложение по типу покера. Есть список комнат, какой-то пул комнат сервер держит постоянно созданными, какие-то комнаты пользователи создают сами(с паролем и индивид настройками).
Когда в комнату заходят достаточное кол-во игроков, начинается игра. Ведущий сначала раздает всем игрокам карты, после чего ждет или того что все игроки сделают ставки, или что истечет время данного этапа и перейдет к след.шагу (ложит часть карт на стол и снова ждем ставки, а в конце начисляет выигрывшему фишки на баланс, и переводит игру к 1 шагу, тоесть новой раздаче).
Как это реализовать серверно?
Бекенд привык писать на laravel, nodejs обычно только для дополнительных сервисов.
Вижу два варианта:
1) Сделать единый процесс на nodejs и в качестве бекенда, и в качестве ведущего комнат(+1 процесс в кач. socket-сервера), а комнаты хранить в его оперативе. Тоесть этот процесс слушает 80 порт на http resp api запросы и отвечает на них, а также содержит переменную Rooms, в которой и будут все комнаты. Он будет пинговать комнаты на необходимость перехода к след.этапу и делать сопутствующие этому действия.
Нравится: очень легко управлять комнатами. При запросе инфы о них - просто берем из переменной. Легко хранить сами ставки и участников комнаты, просто в качестве свойств комнаты.
Что не нравится: нельзя расширить. Тоесть я не могу поставить на другой сервер еще один процесс обработчик комнат, да и вообще не знаю насколько это хорошо и обрабатывать api и бесконечно слушать комнаты.
2) Сделать laravel resp api + процесс (в виде php artisan-команды) который будет обрабатывать комнаты, а сами комнаты хранить в каким-то образом в redis-e (+ socket сервер). Что не нравится - более запутанная реализация, не уверен в виде какого типа данных хранить комнаты в редисе, как хранить ставки.
Но зато не сложно расширить.
Подскажите как это лучше реализовать
Спасибо. Подскажите чуть подробнее что вы имеете ввиду. Управляющего вынести в отдельный процесс и для каждой комнаты делать поток? Где посоветуете хранить сами комнаты и связанную инфу(ставки), стоит ли юзать редис?
mrdragon9000, комнаты хранятся в потоках.
Промежуточные состояния комнат - дублируются в бд.
Комнаты имеют свои идентификаторы и управляются менеджером потоков: supervisor.
mrdragon9000, никак.
За клиентами и комнатами следит супервизор и только он имеет право управления/влияния на комнаты по каким-либо событиям. Событий - может быть много и от разных объектов.
Частный случай одного типа таких событий: действия удалённых клиентов через API (игроков).