Игра в реальном времени в Google Cloud: API канала или вычислительный движок? - программирование
Подтвердить что ты не робот

Игра в реальном времени в Google Cloud: API канала или вычислительный движок?

Нам нужно разработать многопользовательскую игру с производительностью в реальном времени. Это должно работать во всем мире (серверы в Америке, Европе, Азии) и поддерживать огромный трафик. Использование облачных сервисов Google для хостинга.

Мы думаем о таких ссылках, как Jam с Chrome, Chrome Maze или Cube Slam.

Игра:

  • 2 игрока бросают вызов расе.
  • Нам нужно одновременно отображать прогрессию двух игроков
  • Каждый матч может длиться от 30 до 45 секунд.

Хостинг:

Мы, очевидно, будем размещать веб-сайт на AppEngine, автоматическое масштабирование, но думают о 2 решениях для серверов реального времени:

  • Использование веб-серверов с помощью Compute Engine

    Как и для Jam с Chrome, Maze и т.д.
    Разработка собственных серверов websocket (технология TBD), развертывание в центрах обработки данных в Европе, США, Азии, обработка масштабирования, синхронизация между ними, проблемы с задержкой вычислений на серверах и клиентах и ​​т.д.
    Но это довольно технически сложно, так как мы очень короткие по времени, и на данный момент не хватает администратора и сетевого парня.

  • Или используя Channel API

    Мы понимаем, что это не платформа websocket, а производительность в режиме реального времени ниже.
    Но это было бы более простым и безопасным для нас и временем, которое у нас есть.
    Итак, мы также хотели бы узнать об этом больше.

В любом случае мы думаем, что мы можем использовать некоторые графические трюки на передних концах, чтобы они выглядели как в реальном времени, но это действительно зависит, если мы имеем латентность 100 ~ 500 мс или 500 мс ~ 10 секунд.

Некоторые вопросы:

  • Каковы были бы значения диапазона латентности для разных решений?
    (Jam w/Chrome получил 100 мс с GCE, может ли API канала достичь нескольких секунд?)
  • Как серверы API каналов обрабатывают высокий трафик, как работает масштабирование, может ли латентность идти очень высоко? (нет информации об этом в документах канала?)
  • Что делать, если кто-то во Франции играет с кем-то в США, подключаясь к разным серверам, ожидая их синхронизации, как с этим бороться?
  • Любые советы или опыт для обмена?
  • Любое интересное чтение или просмотр? (видел некоторые, но не очень точные).
  • Любое другое решение?

Спасибо за любой комментарий!

ИЗМЕНИТЬ:

  • Только 2 игрока, соединенные вместе, потенциально из разных регионов мира, не нуждаются в трансляции.
  • Мы могли бы найти некоторые трюки с передней стороны, чтобы избежать обработки на стороне сервера. Это гонка между двумя игроками, поэтому нам просто нужно сравнить их прогрессию, и реальное решение победителя не так важно, поскольку нет никаких реальных вещей, чтобы выиграть, это больше для удовольствия.
4b9b3361

Ответ 1

Если вам нужен сервер для обработки данных:

Я бы определенно пошел с websockets в Compute Engine!

API каналов намного медленнее, а также довольно непредсказуем (латентность отличается от сообщения к сообщению)! Данные должны поступать на сервер каналов, который отправляет его в экземпляр App Engine, который должен выполнить запрос обратно на сервер каналов, который будет вызывать сообщение клиенту. Слишком много происходит там, если вы хотите сохранить латентность!

Вот стресс-тест API каналов:
http://channelapistresstest.appspot.com/
Попробуйте нажать кнопку "отправить 5", и вы увидите, что числа ожидания увеличиваются до нескольких секунд.

API каналов также довольно дорог при большой нагрузке (он, вероятно, плохо масштабируется, даже если Google, конечно, может решить это с большим количеством экземпляров).

Сохраняя латентность, геолокация очень важна. С сервером websocket в Compute Engine вы можете отправлять своих европейских посетителей в европейский центр обработки данных google и ваши американские посетители в центр данных США (используя заголовки геоданных, которые AppEngine предоставит). У вас нет такого контроля с API каналов (или движком приложения, с которым все ваши сообщения передаются через). Возможно, у Google есть пограничные серверы для API каналов (я не знаю), но если ваш экземпляр AppEngine находится на другой стороне планеты, это не имеет значения.

Если вам НЕ нужен сервер для обработки данных:

Вы должны установить одноранговое соединение с WebRTC, отправляя материал напрямую между браузерами пользователей. Это был Cube Slam. (WebRTC требует некоторого первоначального подтверждения связи ( "сигнализация" ), так что два одноранговых узла могут найти друг друга, а API каналов будет отлично работать для этого подтверждения, что всего несколько сообщений для установления однорангового соединения.)

WebRTC DataChannels API предоставит вам хороший интерфейс, подобный websocket, например channel.onmessage = function(e) { yadayada()... }; и channel.send("yadayada"); для отправки ваших данных между одноранговыми узлами.

Иногда WebRTC не может устанавливать одноранговое соединение. Затем он вернется на сервер TURN, который передает трафик между сверстниками. Cube Slam использует серверы TURN, работающие на ComputeEngine (как в Европе, так и в Америке, чтобы поддерживать латентность), но это просто резерв, когда истинный одноранговый узел невозможен.

Ответ 2

Это также зависит от других вещей, таких как масштабируемость.

Ingress построен на движке приложения, а часть от случайного сбоя кеша довольно впечатляет.

Помните, что в канале api используется talk.Google, на котором построена служба тусовки. Масштабируемое и реальное время.

Лично, если ваши уровни трафика будут непредсказуемыми и непредсказуемыми, перейдите в приложение. Если вы считаете, что это можно контролировать и прогнозировать, используйте вычислительный движок или что-то еще.

Ответ 3

Ответ Альфреда является лучшим в вопросе, который я задал. Большое вам спасибо!

Однако я забыл упомянуть несколько важных моментов, и область изменилась немного:

  • У нас очень мало времени на разработку (около 1 недели)
  • Это для кампании, которая будет продолжаться только 3 недели (нам нужно будет поддерживать ее через несколько месяцев после этого, но это не так, как будто нам нужна долговечная архитектура).
  • Нам нужно, чтобы он работал над более широкой аудиторией браузера (WebRTC работает только на Chrome и Firefox)

В соответствии с этими пунктами мы в итоге пришли к третьему решению:
Использование PAAS в режиме реального времени.

Это проще и быстрее разрабатывать, дешевле, так как нам не нужен прочный серверный разработчик и администратор системы/сети, и мы можем больше сосредоточиться на проекте, чем на инфраструктуре и платформе.

Есть несколько сервисов, которые кажутся хорошими там, уже размещая MMO RPG и вид, во всем мире, с низкой задержкой и хорошими системами масштабирования.
Вот список поставщиков:
https://github.com/leggetter/realtime-web-technologies-guide/blob/master/guide.md