Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了node.js – 使用TCP负载平衡器代理W​​ebSockets,没有粘性会话大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我想使用Amazon Elastic Load Balancer代理WebSocket连接到多个node.js服务器。由于Amazon ELB不提供实际的WebSocket支持,我需要使用其vanilla TCP消息传递。但是,我想了解如果没有某种粘性会话功能,这将如何工作。

我理解WebSockets通过首先从客户端发送http升级请求来工作,这是由服务器通过发送正确处理密钥身份验证的响应来处理的。在服务器发送响应并且它被客户端批准之后,在该客户端和服务器之间存在双向连接。

但是,让我们假设客户端在批准服务器响应后,将数据发送到服务器。如果它将数据发送到负载均衡器,然后负载均衡器将该数据中继到不处理原始WebSocket升级请求的不同服务器,那么这个新服务器将如何知道WebSocket连接?或者客户端会自动绕过负载均衡器并将数据直接发送到处理初始升级的服务器吗?

解决方法

我想我们需要理解为了回答这个问题是底层TCP连接是如何在整个WebSocket创建过程中演变的。你会意识到,WebSocket连接的粘性部分是底层的TCP连接本身。我不知道你的意思与“会话”在WebSockets的上下文中的意思。

这个想法是,最初客户端向http服务器发送http GET请求,包括升级头字段。为了发生这个请求,客户端需要建立到http服务器的TCP连接。后续http服务器响应通过相同的TCP连接发送。

请注意,现在,在发送服务器响应后,如果客户端或服务器未主动关闭,TCP连接仍然打开/活动。

现在,根据RFC 6455,WebSocket标准,在section 4.1结束:

我从这里读到,在发送初始http GET(升级)请求之前,客户端发起的仍然是相同的TCP连接将保持开放,并且从现在起用作全双工WebSocket连接的传输层。这是有道理的。

对于你的问题,这意味着任何负载均衡器将仅在初始http GET(升级)请求之前,即在两个通信端点之间建立WebSocket连接创建所涉及的唯一TCP连接之前起作用。此后,连接保持建立并且不能变得“重定向”或者任何网络设备之间的连接。

我们可以得出结论,在你的会话术语中,TCP连接定义了会话。只要WebSocket连接是活的(即不被终止),它通过定义提供并且生活在它自己的会话中。没有什么可以改变这个会话。在这图片中,两个独立的WebSocket连接,但是,不能共享同一个会话。

如果你的意思是其他与“会话”,那么它显然是一个由应用程序层介绍的会话,我们不能评论那个。

根据您的意见编辑:

不,这是错的,至少在一般。它肯定在TCP连接建立方面起重要作用,因为它可以决定如何处理客户端连接尝试。具体取决负载均衡器的确切类型(*,请参见下文)。重要:在两个端点之间建立连接之后 – 而我们不认为负载均衡器是端点,我们指的是WebSocket客户端和WebSocket服务器 – 两个端点在生命周期中不再改变的WebSocket连接。负载均衡器可能*仍在中间,但不再起重要作用。

是!

***有不同类型的负载平衡。根据类型,负载均衡器的角色在两个端点之间建立连接之后是不同的。例子:

>如果负载平衡发生在DNS基础上,则负载平衡器根本不参与最终的TCP连接。它只是告诉客户端哪个主机必须直接连接。
>如果负载均衡器的工作方式类似于AWS的第4层ELB(docs here),那么它就代表TCP连接。所以客户端实际上会看到ELB本身作为服务器。然而,会发生什么,是ELB只是向两个方向转发包,没有改变。因此,它仍然大量涉及TCP连接,只是透明地。在这种情况下,实际上有两个永久TCP连接:一个从您到ELB,一个从ELB到服务器。这些在您的WebSocket连接的生命周期中也是永久的。

大佬总结

以上是大佬教程为你收集整理的node.js – 使用TCP负载平衡器代理W​​ebSockets,没有粘性会话全部内容,希望文章能够帮你解决node.js – 使用TCP负载平衡器代理W​​ebSockets,没有粘性会话所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。