【问题标题】:How nodejs can maintain multiple concurrent connections? [closed]nodejs如何维护多个并发连接? [关闭]
【发布时间】:2013-06-04 10:31:13
【问题描述】:

我阅读了很多关于 nodejs 的内容,但仍然不清楚以下内容:

  • 使用 TCP 协议客户端和服务器在一个端口上达成一致,然后可以保持连接。服务器知道客户端的 IP 地址,因此可以发回消息。如果我们使用 nodejs,那么多个客户端可以连接到同一个端口上的同一个 nodejs 服务器。这怎么可能?同一服务器如何在同一端口上建立多个连接。
  • 如果客户端在 NAT 之后,那么它的 IP 可以是动态的,那么 nodejs 服务器如何向客户端发送数据。
  • 在服务器和客户端上维护持久连接的资源利用率是多少?
  • nodejs 服务器崩溃时发生了什么?客户端如何重新发起连接?
  • 如果客户端出现网络问题,并且每 5 分钟后终止并启动连接..那么有没有办法处理这种情况?

【问题讨论】:

    标签: node.js connection persistent-connection


    【解决方案1】:

    使用 TCP 协议,客户端和服务器在一个端口上达成一致,然后可以保持连接。服务器知道客户端的 IP 地址,因此可以发送回消息。如果我们使用 nodejs,那么多个客户端可以连接到同一个端口上的同一个 nodejs 服务器。这怎么可能?同一服务器如何在同一端口上建立多个连接。

    单个端口上可以维护的连接数量没有限制(尽管实际上可能存在操作系统或硬件限制)。当然,只有单个进程可以监听端口,但这与连接无关。这不是特定于节点的,所有 TCP 服务器都是这样工作的。

    如果客户端在NAT之后,那么它的IP可以是动态的,那么nodejs服务器如何向客户端发送数据。

    您实际上是在问 NAT 是如何工作的。同样,在这种情况下没有特定于节点的内容。 NAT 服务器根据需要简单地更改数据包标头,并维护路由转换表,就像任何连接一样。

    在服务器和客户端上维护持久连接的资源利用率是多少

    对于连接本身而言,开销确实非常小。一点点记忆,但在大局中几乎微不足道。如果您为每个连接存储额外的关联数据,则可能会有所不同。 Node.js 可以很好地处理大量并发连接,但如果您担心,您可以随时搜索基准测试,或者自己编写。

    nodejs服务器崩溃时发生了什么?客户端如何重新发起连接?

    套接字同时发出closeerror 事件。只需监听它们,然后尝试重新连接,可能会有一个回退延迟。

    如果客户端出现网络问题,并且每 5 分钟后终止并启动连接..那么有没有办法处理这种情况?

    不完全确定你在这里问什么。客户端只需按照上一个问题/答案中的说明重新连接即可。如果您将某些数据与客户端套接字相关联,并且您想要一个宽限期,让客户端有机会在释放该数据之前重新连接,那么您需要设置一个超时,该超时将在一定数量后释放这些资源的时间。然后,在连接侦听器中,或者可能在身份验证事件中,您需要分析新连接以查看它是否与最近断开连接的客户端匹配。

    我绝对推荐查看socket.io,特别是如果您的用例是基于网络的,尽管它不仅可以用于浏览器/服务器连接。它会或多或少地自动完成许多您似乎关心的事情(重新连接、资源关联、断开连接宽限期等)。

    【讨论】:

      【解决方案2】:

      TCP 连接保持持续打开。保存是通过客户端不必以长池的方式从服务器连续刷新来实现的,以便检查服务器上是否有任何新消息,就像在 AJAX 的情况下一样。每隔几秒钟创建一个新连接以供客户端从服务器刷新,这对服务器、代理和路由器来说很繁重。在 Node.js 连接保持打开的情况下,但在客户端或服务器有东西要发送之前它是不活动的。在这里找到好文章http://www.html5rocks.com/en/tutorials/websockets/basics/

      假设有 1000 个聊天客户端,每个聊天客户端每 3 秒询问一次服务器是否有新消息到达。这导致服务器上每分钟有 2000 个请求和响应。在 Node.js 的情况下,只有当有消息要发送时,服务器才会向客户端发送消息,同时所有 1000 个连接都将处于空闲状态,但会保持打开状态。

      TCP 连接始终在同一个端口(如端口 80)上启动,但在每个连接打开时分配给每个连接的不同端口上保持通信。因此,您仍然需要保持连接持续打开,但您不必像以前需要的那样持续发送池消息。

      【讨论】:

        猜你喜欢
        • 2020-10-15
        • 2016-09-02
        • 2021-10-15
        • 2017-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多