Привет. В этой части моего блога о разработке я опишу инфраструктуру, которую я выбрал для раннего развития моей онлайн -постоянной вселенной Single/Coop Players Space Game, AGS9. Я постараюсь описать причины моего выбора и описать некоторые технические вещи. Это то, что я собираюсь реализовать дальше в своем процессе разработки.
Чтобы облегчить развертывание, а не «скришать» с серверами и инфраструктурой, я решил запустить свой игровой сервер под Heroku. Вместо того, чтобы выбрать процесс в реальном времени, который «все время работает в фоновом режиме», и вычисляет следующий «тик» вселенной в какой-то Gameloop, возможно, используя ECS (систему компонентов объекта) для отслеживания всех вещей, которые должны Продолжаюсь, я решил пойти старым «классическим веб-приложением» и иметь реляционную базу данных и веб-сервер.
Несмотря на то, что игра «кажется» в режиме реального времени, она не должна быть такой же отзывчивой, как стреляющий из первого лица, и я могу иметь задержку сети использования реляционной базы данных, чтобы ответить на вопросы клиента, такие как: «Какие планеты в этой солнечной системе? » или «Сколько у меня ресурсов?». Клиент также может спросить веб -сервер или более подходящего игрового сервера, подобные запросам, таким как «Создайте мне хороший колония». В этом случае я намерен написать «запись на сборку» в какой -то таблице, а затем сделать что -то немного странное.
Что -то, что немного странно это. У меня есть система задач/событий, в этом случае работник сельдерея с постоянным бэкэдом Redis (также на Heroku), и я пишу задержку с задержкой, через 5 часов, которая напишет в некоторую очередь (вероятно, снова Redis), что колония корабль был построен. Мне нужно проверить базу данных, прежде чем я опубликую это событие, потому что пользователь мог бы выбрать отмену сборки, и у меня нет простого или надежного способа удаления события «построенный корабль» из очереди.
Игровой сервер, то есть веб -процесс на Heroku, слушает очередь, которую я упомянул. Получив успешное мероприятие «Корабль построено», я уведомил всех клиентов с подключенными к веб -сайтам, чтобы они могли показать приятное сообщение для игрока. Корабль также добавляется в таблицу флота для игрока (вероятно, работником, хотя, а не веб -процессом).
Это немного странно, но я предпочитаю иметь систему на основе событий, а не какую-то «DB-Queue», которая запрашивает таблицу «следующие сборки» для рядов с «временем окончания», которое до сих пор, и действует соответственно. Я бы не хотел, чтобы такая петля была в нескольких секунде крона, возможно, не делая много итерации.
Постоянство сервера Redis должна сохранять задержку задачи после перезапуска или сбоя Redis, поэтому я надеюсь, что в этом случае со мной все будет в порядке.
Мне нужно немного прочитать и подумать о случае, когда мне придется масштабировать серверы Redis, сохраняя при этом настойчивость между ними. Это интересный момент.
Несколько слов на стороне клиента.
В настоящее время, на текущем этапе разработки, я размещаю два статических веб -сайта на платформе DigitaloCean App. Первое-это статически экспортируемое приложение JS, которое аутентифицирует игрока Auth0. Другой веб-сайт-это приложение «Только для игры», основанное на фазере, которое подключается к моему серверу Heroku с WebSocket. Есть небольшое «рукопожатие» после установки подключения к WebSocket, где токен AUTR0 доступа передается на сервер для проверки.
Причиной разделения их является то, что первый сайт построен быстро, чтобы просто дать самую основную аутентификацию и управление играми игр, и после того, как игра станет более зрелой, я мог заменить этот «портал» или «сайт лобби» на хорошо Замена полированной замены, которую я построю, не изменяя код для клиента Phaser Game.
Мне пришлось придумать способ передать токен с следующего сайта JS к приложению Phaser. У меня придумал страницу под следующим приложением, которое загружает другое игровое приложение в полную проверку iframe и использует Postmessage, чтобы пройти токен. Например, передача токена с помощью параметра запроса плохо по разным причинам, и я не хотел держать токен в глобальном окне. Что-то переменная, чтобы защитить токен (чрезмерная безопасность:)).
Эти веб-сайты развернуты с платформой приложений DigitaloCean, которая наряду с Heroku дает мне какую-то элементарную систему CI/CD, которая позволяет мне сосредоточиться на разработке приложений, а не в развертывании и облачной инфраструктуре.
Быстрый совет со следующими статическими сайтами JS и платформой приложений должен добавить Trailingslash: True Для вашей следующей конфигурации, поэтому маршрут, подобный MyDomain.com/Play, не является 404 с текущей маршрутизацией платформы приложения. Экспортируемая страница Play.html недоступна по такому маршруту, но если у вас есть Play/Index.html, это работает. Смотрите это: https://www.digitalocean.com/community/questions/nextjs-export-redirect-path-without-extension-to-path-with-html?answer=65145
Я надеюсь, что это не слишком скучно. В следующей части я намерен написать о первой «тестовой игре», которую я собираюсь разработать, и о том, как я ее построил.
Оригинал: «https://dev.to/amireldor/early-heroku-and-app-platform-infrastructure-with-some-thoughts-about-letting-you-know-when-your-colony-ship-has-been-built-5c6b»