TCP配置的Amazon Elastic Load Balancer上的Socket.io Websockets

Sud*_*han 16 amazon-web-services websocket node.js socket.io

我打算在EC2上建立一组运行Socket.io的NodeJS应用服务器,我想使用Elastic Load Balancer在它们之间分配负载.我知道ELB不支持开箱即用的Websockets,但我可以使用场景2中描述的设置.

但是,正如博客文章所述,我注意到此设置不提供会话亲缘关系或源IP信息:

我们不能使用此设置具有Session Affinity或X-Forward标头,因为ELB不解析HTTP消息,因此无法匹配cookie以确保Session Affinity或Inject特殊的X-Forward标头.

在这种情况下,Socket.io仍然会工作吗?或者是否有另一种方法可以在SSL负载均衡器后面安装一组Socket.io应用服务器?

编辑:蒂姆卡斯韦尔谈到这里已经这样做.有没有解释如何设置的帖子?再次,这里没有会话粘性,但似乎工作正常.

顺便说一句,websockets实际上是否需要粘性会话?信息是作为新的和单独的请求传播还是只有一个请求+连接所有信息都在移动?

Jac*_*ter 15

即使使用TCP ELB,Socket.io也无法开箱即用,因为它在将连接升级到websockets之前会发出两个HTTP请求.

第一个连接用于建立协议,因为socket.io不仅支持websockets.

GET /socket.io/1/?t=1360136617252 HTTP/1.1
User-Agent: node-XMLHttpRequest
Accept: */*
Host: localhost:9999
Connection: keep-alive

HTTP/1.1 200 OK
Content-Type: text/plain
Date: Wed, 06 Feb 2013 07:43:37 GMT
Connection: keep-alive
Transfer-Encoding: chunked

47
xX_HbcG1DN_nufWddblv:60:60:websocket,htmlfile,xhr-polling,jsonp-polling
0
Run Code Online (Sandbox Code Playgroud)

第二个请求用于实际升级连接:

GET /socket.io/1/websocket/xX_HbcG1DN_nufWddblv HTTP/1.1
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: MTMtMTM2MDEzNjYxNzMxOA==
Host: localhost:9999

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 249I3zzVp0SzEn0Te2RLp0iS/z0=
Run Code Online (Sandbox Code Playgroud)

您可以在上面的示例中看到xX_HbcG1DN_nufWddblv请求之间的共享密钥.这就是问题.ELB执行循环路由,这意味着升级请求命中服务器而不是参与初始协商.因此,服务器不知道客户端是谁.

内存状态数据是负载平衡的敌人.值得庆幸的是,socket.io支持使用Redis来存储数据.如果您与多台服务器共享redis连接,它们基本上共享所有客户端的会话.

有关设置Redis的详细信息,请参阅socket.io wiki页面.


anu*_*_29 12

您现在可以使用AWS最近推出的新应用程序负载均衡器.

只需用ALB(应用程序负载均衡器)替换ELB(现在称为Classic负载均衡器)并启用粘性会话.

ALB支持Web套接字.这应该可以解决问题.

https://aws.amazon.com/blogs/aws/new-aws-application-load-balancer/

http://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html


小智 5

正如我在帖子中提到的,我们只使用ELB来跨ssl终止并在支持websockets的http代理服务器集群之间进行负载平衡.ELB不直接与websocket服务器通信.HTTP代理集群处理查找正确的socket.io服务器以连接以确保会话粘性.