Есть ли лучшее решение, чем socket.io, для медленного внутриигрового чата? - PullRequest
1 голос
/ 08 апреля 2020

Я создаю браузерную игру с node.js (backend api) и angular (frontend). Моя цель - реализовать внутриигровой чат, чтобы позволить игрокам общаться на одной карте. Чат не является важной частью игры, поэтому сообщения не должны быть мгновенными (задержка в несколько секунд должна быть в порядке). Это просто классная возможность общаться несколько раз вместе.

Хорошее решение должно заключаться в реализации socket.io для общения в реальном времени. Но так как чат не является обязательным компонентом и является единственной вещью, которая потребует веб-сокетов, мне интересно, если нет альтернативы, чтобы избежать перегрузки сервера при обработке сокетов.

Я думал о опросе каждые 2 или 3 секунд мой REST API для запроса новых сообщений, но он может перегрузить сервер таким же образом ... Каковы ваши рекомендации?

Спасибо за советы

1 Ответ

1 голос
/ 08 апреля 2020

Есть довольно крутой пакет под названием signalhub . Он имеет серверный компонент nodejs и материал, который вы можете использовать в браузерах своих пользователей. Он использует не очень известное приложение протокола http (https) под названием EventSource . EventSource в основном открывает постоянные http (https) соединения с веб-сервером.

Это надежная и легкая установка. (README говорит о сигнализации WebRT C, но это полезно для гораздо большего.)

На стороне сервера простая, но эффективная настройка сервера может выглядеть следующим образом:

module.exports = function makeHubServer (port) {
  const signalhubServer = require('signalhub/server')
  const hub = signalhubServer({ maxBroadcasts: 0 })

  hub.on('subscribe', function (channel) {
    /* you can, but don't have to, keep track of subscriptions here. */
  })

  hub.on('publish', function (channel, message) {
    /* you can, but don't have to, keep track of messages here. */
  })

  hub.listen(port, null, function () {
    const addr = hub.address()
  })
  return hub
}

В браузере вы можете делать такие вещи. Это пользователь GET, чтобы открыть постоянный EventSource для получения сообщений. И когда приходит время отправить сообщение, оно отправляет его.

И вкладка Chromium devtools Network знает все о подключениях EventSource.

  const hub = signalhub('appname', [hubUrl])
  ...
  /* to receive */
  hub.subscribe('a-channel-name')
    .on('data', message => {
      /* Here's a payload */
      console.log (message)
    })
  ...
  /* to send */
  hub.broadcast('a-channel-name', message)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...