nodejs如何维护多个并发连接?

时间:2013-06-04 10:31:14

标签: node.js connection persistent-connection

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

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

2 个答案:

答案 0 :(得分:4)

  

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

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

  

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

你实质上是在询问NAT是如何工作的。同样,在这种情况下,没有任何特定于节点的内容。 NAT服务器只需根据需要改变数据包标头,并维护转换表以进行路由,就像使用任何连接一样。

  

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

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

  

当nodejs服务器崩溃时会发生什么?客户端如何再次启动连接?

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

  

如果客户端出现网络问题,它会在每5分钟后终止并启动连接..那么有什么方法可以处理这种情况?

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

我肯定会建议查看socket.io,特别是如果您的用例是基于Web的,尽管它不仅可以用于浏览器/服务器连接。它会或多或少地自动执行你似乎关注的很多事情(重新连接,资源关联,断开宽限期等)。

答案 1 :(得分:0)

TCP连接保持连续打开。客户端不必以长池方式连续刷新服务器来实现保存,以便检查服务器上是否有任何新消息,例如AJAX。每隔几秒钟创建一个新连接,客户端就可以从服务器刷新服务器,代理和路由器。如果Node.js连接保持打开状态,但在客户端或服务器发送内容之前它不会处于活动状态。在这里找到了好文章http://www.html5rocks.com/en/tutorials/websockets/basics/

想象一下拥有1000个聊天客户端,如果有任何新消息到达,每个客户端每3秒会询问一次服务器。这导致服务器上每分钟2000个请求和响应。如果Node.js服务器仅在有消息要发送时才向客户端发送消息,而所有1000个连接在此期间将处于空闲状态,但将保持打开状态。

TCP连接始终在端口80之类的同一端口上启动,但通信是在打开时分配给每个连接的不同端口上的维护。所以你仍然需要不断打开连接,但你不必像以前那样连续发送池信息。