【问题标题】:will concurrency cause Socket.io + Nodejs fail并发会导致 Socket.io + Nodejs 失败
【发布时间】:2021-05-02 20:53:00
【问题描述】:

好的,我正在开发一个需要真实通信的游戏,所以我在其中使用了 socket.io,所以我目前正在尝试处理游戏的断开连接,我担心在我处理断开连接时可能会同时发出另一个事件来制作游戏冻结。我知道nodejs是单线程的,但是如果我为我的服务器运行多个容器我知道我应该使用负载平衡,以便某个套接字的请求转到同一个实例,但这可能会在断开连接时发出并发事件一个用户?那么在我的后端扩展 socket.io 时如何处理或者我错过了什么?

我想到的一个解决方案是我可以通过 gameId 平衡请求,这样在同一个游戏中的用户最终会加入我的服务器的同一个实例,但我不知道这样的事情是否适用

【问题讨论】:

    标签: node.js sockets concurrency


    【解决方案1】:

    在这种情况下,从事件循环的角度来看,是的节点是“单线程”的,因此您的所有请求都会在它们进入时排队。

    这意味着如果您将 socket.io 用于您的“游戏”,那么每个发送到服务器的消息将一个接一个地同步执行。话虽如此,Node 在这里非常高效,但在负载过重或长/阻塞脚本下可能会使服务器陷入爬行状态。

    幸运的是,您可以使用 PM2 之类的工具轻松地集群节点,这将使您可以使用 VM 上的每个“核心”并在所有核心之间实现负载平衡。

    但是.. 如果我们需要维护状态,这会让我们有点束缚,因为 PM2 实际上会在每个“核心”上生成一个新版本的应用程序,它无法在每个实例之间进行通信,这意味着会话不会在每个实例之间共享运行实例,也不是存储在每个 VM 上的文件在 etc 之间可访问。

    这意味着,要大规模扩展 node / socket.io,您需要拆分应用程序的一些部分,这将需要一些额外的服务,因此您的堆栈可能看起来像

    1. 节点服务器(可以是多个带有 LB infront 或容器的 VM)
    2. Redis 服务器(您将在此处存储会话信息和 socket.io 数据)

    现在,有很多方法可以构建它,但作为示例,一种方法可能是 (假设您将使用 pm2 进行集群)

    1. 游戏节点应用程序 - 2 个虚拟机 @ 2 个运行 PM2 的 vcpu(将是 4 个正在运行的游戏实例)
    2. Socket.io 服务器 - 2 个虚拟机 @ 2 个运行 PM2 的 vcpu(将是 4 个正在运行的 socket.io 服务器实例)
    3. Redis 服务器(根据负载,您可能希望拥有 2 个单独的实例,一个用于会话和游戏项目,另一个用于管理 socket.io)
    4. 用于存储图像的对象存储(S3 或其他对象存储)
    5. 可选的 CDN

    有了 Socket.io,你肯定会想要使用 redis.socket.io NPM。这将允许您将 socket.io 扩展到多个注意到,socket.io 的 redis 包管理连接的客户端,因此即使用户连接到另一个套接字服务器上,他们仍然能够发出和接收消息

    不确定您现在在哪里托管,但有许多可用的服务,并且根据您想要管理的程度,您可能希望查看来自数字海洋的“应用程序”等服务。它基本上是一个“CAAS”服务,您可以在 GIT 中使用 socket.io 服务器,然后将其部署到正在运行的容器中,DO 将处理每个正在运行的“APP”之间的平衡,因此您可以按需扩展根据需要上下运行实例。虽然它不是最便宜的,并且从带宽等角度来看也有一些缺点,但如果你知道允许你放大和缩小等的尖峰,那就太好了。

    【讨论】:

    • 非常感谢您的精彩解释,但如果我可能会问为什么节点服务器和套接字服务器不一样。这个架构师是否会同步处理同一个房间的每个事件,或者每个服务器实例可能为同一个房间处理不同的事件(假设房间的用户连接到不同的实例)?
    • 没有理由他们不能在同一台服务器上,只是当您考虑规模时,假设您有一个“节点”webapp 和一个套接字服务器。如果只有一个节点应用程序,则不需要另一个节点应用程序。对于evens和rooms,这是socket.io redis用来处理向所有用户发送事件的地方,无论他们连接到什么服务器。因此,发送到 room1 将告诉所有集群套接字服务器在所有实例上发送到 room1
    • 非常感谢。我真的很感激!!
    猜你喜欢
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    相关资源
    最近更新 更多