【问题标题】:Is there a better solution than socket.io for slow-speed in-game chat?对于慢速游戏内聊天,是否有比 socket.io 更好的解决方案?
【发布时间】:2020-07-20 06:31:17
【问题描述】:

我正在使用 node.js(后端 api)和 angular(前端)创建一个浏览器游戏。我的目标是实现游戏内聊天,以允许同一地图上的玩家之间进行交流。聊天不是游戏的重要组成部分,因此消息不需要是即时的(几秒钟的延迟应该是可以的)。一起聊天是一个很酷的功能。

一个好的解决方案应该是实现socket.io来进行实时通信。但是由于聊天不是必不可少的组件,并且是唯一需要 websockets 的东西,我想知道是否没有替代方法可以避免服务器过载处理套接字。

我曾考虑每 2 或 3 秒轮询一次我的 REST API 以请求新消息,但它可能会以同样的方式使服务器过载...您有什么建议?

感谢您的建议

【问题讨论】:

    标签: node.js websocket socket.io chat messaging


    【解决方案1】:

    有一个很酷的包叫做signalhub。它有一个 nodejs 服务器组件和可以在用户浏览器中使用的东西。它使用名为EventSource 的http (https) 协议的一个不太知名的应用程序。 EventSource 基本上会打开到 Web 服务器的持久 http (https) 连接。

    这是一种可靠且轻量级的设置。 (README 讨论了 WebRTC 信号,但它的用处远不止于此。)

    在服务器端,一个简单但有效的服务器设置可能如下所示:

    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 网络选项卡了解所有有关 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)
    

    【讨论】:

    • 我想你知道(但 OP 可能不知道),EventSource 是服务器发送事件的客户端接口。由于游戏内聊天的概念是双向的,EventSource 接口只涵盖双向聊天的一个方向。人们可能不得不单独使用 ajax 调用来发送聊天消息。这就是为什么 socket.io(或 webSocket)在我看来是一个更好的解决方案,因为它们是准备好处理任一方向的数据流的双向通道。
    • 当然你是对的,@jfriend00 OP 确实要求使用 socket.io 替代方案。这个很好地解决了轮询问题。而且,对于发送少量消息,signalhub 的客户端代码完成的 POST 请求是完全合理的。更高的音量?更低的延迟?显然是 socket.io 或 Websockets。
    • 服务器发送事件和 EventSource-API 的另一个优势:负载均衡器、反向代理等更好地处理 SSE(因为它是纯 HTTP。但您可能需要发送 keep-alives 和/或更改默认连接超时)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2013-10-22
    • 1970-01-01
    相关资源
    最近更新 更多