Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 负载平衡Amazon EC2上的Node socket.io_Node.js_Sockets_Amazon Web Services_Amazon Ec2 - Fatal编程技术网

Node.js 负载平衡Amazon EC2上的Node socket.io

Node.js 负载平衡Amazon EC2上的Node socket.io,node.js,sockets,amazon-web-services,amazon-ec2,Node.js,Sockets,Amazon Web Services,Amazon Ec2,我在Amazon的AWS上运行了一个标准的LAMP EC2实例设置。我还安装了Node.js、socket.io和Express以满足实时更新的需求,现在我正处于应用程序的负载平衡阶段。一切正常,但我的插座不正常。以下是我的设置:- --- EC2 >> Node.js + socket.io / Client >> ELB -- \ -

我在Amazon的AWS上运行了一个标准的LAMP EC2实例设置。我还安装了Node.js、socket.io和Express以满足实时更新的需求,现在我正处于应用程序的负载平衡阶段。一切正常,但我的插座不正常。以下是我的设置:-

                  --- EC2 >> Node.js + socket.io
                /
Client >> ELB --
                \
                  --- EC2 >> Node.js + socket.io


[RDS MySQL - EC2 instances communicate to this]
如您所见,每个实例都安装了Node和socket.io。然而,Chrome debug偶尔会发送套接字请求,返回原因
{“code”:1,“message”:“Session ID unknown”}
,我猜这是因为它正在与另一个实例通信

另外,假设我在A页,套接字需要发送到B页-因为负载平衡器,这两个页面可能位于不同的实例上(它们将同时打开)。据我所知,在这种情况下,使用粘性会话之类的方法是行不通的,因为两个页面都将被限制在各自的实例中


我怎样才能避开这个问题?我需要一个完整的专用实例吗?这似乎有些过分…

解决方案是让两个(或更多)node.js安装使用公共会话源

下面是关于将REDIS用作node.js的公共会话存储的前面一个问题

还有一个
当你考虑WebStac的流量(第4层-ISH)和HTTP流量(第7层)在负载均衡器上移动时会出现问题,该负载均衡器一次只能检查一个层。例如,如果将ELB设置为第7层(HTTP/HTTPS)上的负载平衡,则websockets在整个ELB上根本无法工作。但是,如果您将ELB设置为第4层(TCP)上的负载平衡,则任何回退HTTP轮询请求都可能最终出现在任何上游服务器上

你有两个选择。您可以找到一种方法来有效地平衡HTTP和websocket请求的负载,或者找到一种方法来确定地将请求映射到上游服务器,而不考虑协议

第一个非常复杂,需要另一个负载平衡器。值得注意的是,在写这篇文章时,HAProxy没有本机SSL支持。既然是这样,如果你想走这条路的话,完全移除ELB是可能的。如果是这样,第二种选择可能更好


否则,您可以单独使用HAProxy(或Nginx的付费版本)来实现确定性负载平衡机制。在本例中,您将使用IP哈希。这将使用IP地址的前3个八位字节来确定哪个上游服务器获得每个请求,因此除非用户在HTTP轮询之间更改IP地址,否则这应该可以工作

谢谢,我会看看HAProxy-hash-IPs听起来像是我需要使用的东西。但是这对socket.io有用吗?这无疑指向了会话管理问题。我们使用MySQL、Mongo和Dynamo在负载平衡的EC2服务器上的节点中进行会话管理,它们都可以工作。Express允许插件处理此问题,并且它们适用于上述所有数据库。但我还没有用socket.io尝试过。这是值得研究的,但前面的答案可能是针对实际问题的。当您有公共会话存储时,它应该在Express中工作,就像在Node中一样。公共会话存储是将其保持在一起的粘合剂。这样,您就不需要依赖ELB来维护客户端1到服务器B。客户端1可以发送到任何可用的服务器,它将找到会话并处理事务。