В 3й части статей я расскажу простым языком про протоколы передачи данных, как они работают и что такое Websocket сервер и какие есть решения для его создания на PHP
Что такое Websocket сервер
В предыдущей части я рассказал с какими проблемами предстоит столкнутся разработчику при проектировании игрового сервера и пути их решения. Мы определились , что для обработки входящих соединений потребуется некое CLI приложение (демон) - Websocket сервер, которое будет обслуживать входящие запросы от пользователей. Хорошей библиотекой для этого является workerman .
Сам протокол websocket это TCP протокол постоянного соединения (скажем так есть некие "базовые" протоколы на которых делаю уже свои "подпротоколы") между клиентом и сервером (в отличие от HTTP который заканчивается при получении ответа от сервера) , в который группа разработчиков (говорю условно, для понимания) создала некий набор правил по формированию заголовков, разделителя пакетов данных и тп.
PS Никто не ограничивает самому написать свой протокол на базе TCP используя библиотеку по ссылке выше
Его плюсы в том что TCP - так называемый протокол гарантированной доставки пакетов (его можно сравнить с системами очередей который при получении пакета должны отправить назад подтверждение о получении) , а наличие постоянного соединения не требует времени на установку каждый раз нового (как HTTP протокол - правда у него есть Connection: Keep-Alive для поддержания соединения, который правда все равно закроется спустя пару секунд бездействия, но для пошаговых игр подойдет и он) с отправкой дополнительных пакетов а так же пакеты доставляются в той последовательности в которой были отправлены пользователю плюс мы можем без действий со стороны пользователя слать ему новые данные с разной периодичностью.
Из минусов можно выделить : на проверку доставки данных (запрос - ответ) требуется дополнительное время, пакеты идут друг за другом, а не параллельно, так же помимо данных шлются некие системные заголовки (накладные расходы)
PS существует еще один "базовый" протокол - UDP , имеющий меньше накладных расходов , отправляющий данные параллельно целым потоком, не гарантировав их доставку - такой сервер так же может быть игровым например в тех играх где поток данных настолько большой что потеря части - сильно скажется на игровом процессе (например игра Counter-Strike)
Какова пропускная способность
Есть ряд статей , которые рассматривают теоретическую часть пропускной способности TCP на одном порту стремящуюся к миллиардам пользователей, но рассмотрим тесты на базе фреймворка (доступна установка через composer ) workerman :
По результатам тестов мы можем видеть что workerman стоит на следующих позициях:
1 место (с использованием php 8 и Jit пре компиляции php скриптов в некие "бинарники")
2 место - его модификация с заменой Apache и Nginx на HTTP сервер написанный на PHP слушающий порт сервера (те работает и определяется PHP как CLI , без запуска fpm workers). Документация на Китайском , но механика следующая : Singleton'ы (грубо говоря закешированные экземпляры классов) всех контроллеров, вызывающиеся в onMessage() (метод срабатывающий когда на порт сервера приходят данные посланные клиентом из браузера) с параметрами которые пришли в запросе и увеличенный параметр keep-alive (те между браузером и сервером устанавливается постоянное TCP соединение которое дольше остается открытым чем в том же Apache где этот параметр ~10 секунд) - нам не очень актуален этот фреймворк тк мы не будем использовать HTTP
3 и 8 место держат вариации с использование PostgreSql и без модификаций
В среднем ~ 350 000 запросов в секунду . Хотя рейтинг и для HTTP протокола, но включенный keep-alive заставляет сервер работать на подобии websocket удерживая соединения).
Остается вопрос: хороший ли это показатель и какое число пользователей можно держать онлайн ?
Ответ на этот и другие вопросы я опишу в следующей части статей про разработку сервера для онлайн игр на php
Буду признателен за лайки - так я могу видеть интересна ли вам данная тематика и стоит ли ее продолжать (тк в русскоязычном пространстве достаточно мало информации про то как создавать сервера для игр, о чем я писал в первой части серии статей).
Подписывайтесь на мой профиль что бы не пропустить новые стать
BIOACE
Предыдущая часть была на мой взгляд более информативная, хоть мне человеку далёкому от php не совсем понятны некоторые моменты. (Читаю чтобы в целом узнать что-то новое про архитектурные решения).
В данной части мы видим информацию о UDP и TCP протоколах, но информации мало. Можно добавить что довольно часто в играх используют либо оба протокола, чтобы важная информация точно доходила до сервера и обратно, а менее важная, как например передвижение в том же самом CS всегда приходила нам наиболее актуальная. Ведь в чем минус TCP кроме того что он медленный, а в том, что в случае если пакет не получен он его переотправит, но не факт что к этому моменту там будет актуальная информация.
Плюс можно было б упомянуть такую вещь как Reliable UDP.
А теперь небольшой п.с: скачал я ваше демо приложение на андроид. Управление сделано ужасным образом. Мало того что движение воспринимается только в 4 стороны, так ещё и очень часто неправильно определяет сторону, вплоть до противоложной.
webrobot Автор
Это не проблема конкретно tcp , у вас и udp может так же не дойти (его сервер вообще не переотправит) и информация устареет.
Из за этого в играх происходит так называемый freez, что следствие высокого ping (в следующих статьях я раскажу как с этим бороться), тк в обычных случаях эта переотправка занимает микросекунды
Я не углубляюсь в подвиды "базовых" протоколов , но упомянул что можно создать свой, в тч и для udp, вопрос какие задачи преследуются (для игр с большим экшоном и где потеря одного двух пакетов не важна - подойдёт он).
Я не профессионал в Unity3D и игровые клиенты созданные мной служат для демонстрации работы сервера, например:
В игре есть алтарь воскресения слева внизу, стоя на нем вы сможете воскресить и заметить как 300 гоблинов под управлением сервера двинутся на вас выбирая кратчайший путь - это демонстрация работы "пулов".
Так же можно кликать на область и сервер (не сам клиент) рассчитает ближайший путь
Карта мира - портирована из программы Tiled (https://www.mapeditor.org/) в бд mysql и передаётся в клиент игры при входе на локацию (те ее можно динамически менять на сервере без обновления уже скаченных клиентских приложений)
И самое главное - все действия видят все игроки на карте (которых может быть много)
Есть и игры заказчиков, в тч связанные с криптой, где технология прижалась