Я пишу игровой портал, собственно закончил все фитчи теперь нужно заняться конкретно играми. Прежде чем начинать хочу получить совет, как лучше сделать.
Придумал следующее:
- пользователь заходит в игру (переходит на страницу игры)
- далее на странице игры есть все заявки от других пользователей и возможность создать свою заявку
- далее пользователь входит или создает свою заявку и ожидает соперника/ков
- когда соперники все зашли пользователей кидает на страницу игры на начинается игра.
Для реализации игр было выбрано решение node.js, сам сайт yii
теперь собственно вопросы.
1) Когда пользователь ожидает соперников находясь в своей заявке на игру, что лучше использовать сокет + нода или проверять аяксом раз в 3 секунды например ?
2) когда начнется игра php бросит ноде данные о игроках. Что лучше передать массив из user_id игроков или конкретно номер заявки, что бы нода сам достал из базы ? Заявки и все по сайту у нас мускул, логи игр - монго ?
1. Лучше сокет, так как не надо будет впустую теребить сервер каждые 3 секунды. Но надо помнить про поддержку сокета браузерами
2. Номер заявки. Применял похожу схему - относительно медленно работает передача из пхп через сокет, особенно если много данных. Достать из мускуля по PK очень дешевая операция.
Я же написал, что это относительно медленно. Запросы из пхп в ноду это: делаем запрос от клиента к пхп. Это уже накладные расходы, так как мы шлем заголовки, открываем коннект + пинг. Но судя по архитектуре автора от этого не избавиться. Затем забираем из базы (открытие коннекта + запрос) и курлом шлет еще один запрос, но уже ноде (все это блокируется внутри одного процесса, который для пхп-фпма занимает несколько мегабайт и при большом количестве запросов процессов может не хватить. Этим заставим ждать пользователей). Тут ситуация лучше, так как скорее всего все это на одном сервере или с маленькой задержкой, но данных становится еще больше. Нода получает запрос и дальше пошло-поехало. Почему бы это не сократить до варианта: отправляем ноде напрямик id заявки (первый запрос, от которого не избавиться), нода открывает коннект к базе в неблокирующем режиме (да, нода она такая, все асинхронно делает. В это время другие пользователи тоже могут слать запросы не ожидая пока первый завершится), забирает данные, пошло-поехало. Разница: один лишний POST запрос. Т.е. если к вам пришло 100000 запросов, то вы на самом деле добавите еще 100000 (чтобы Вы поняли, что я имею ввиду под "медленно"). Больше расход памяти (пхп процесс будет висеть некоторое время)
хм интересно, спасибо за ответы, я попробую реализовать, если что опишу что как. ну ждать 1 - 2 секунды не критично. Хотя смотря о какой задержке идет реч. ?
меньше 1 секунды ) но вы должны как разработчик рассматривать этот простой не в контексте одного запроса, а в масштабе планируемой нагрузки. Для 100 пользователей в час - 1-2 секунды не критично. Но предположим, что у вас префоркнуто 100 процессов пхп-фпм и 1000 пользователей одновременно делают запрос (вдруг очень популярным стало). Первые 100 пользователей успевают захватить процессы. Остальные ждут пока первые 100 отработают. Затем следующие 100 захватывают процессы, а 800 также ждут. В итоге тем, кому меньше всего повезло будут ждать дольше всех. А ведь за это время прибудут еще пользователи. В итоге Ваша система получит среднее время ответа куда ниже, чем среднее время выполнение скрипта. Можно, конечно, увеличить количество процессов, но делать это бесконечно не выйдет.