TCP配置的Amazon Elastic Load Balancer上的Socket.io Websockets
我打算在EC2上建立一组运行Socket.io的NodeJS应用程序服务器,并且我想使用Elastic Load Balancer在它们之间传播负载。 我知道ELB不支持开箱即用的Websockets,但我可以使用场景2中描述的设置。
但是,如博客文章中所述,我注意到此设置不提供会话亲缘关系或源IP信息:
我们不能使用Session Affinity或X-Forward标头进行设置,因为ELB不会分析HTTP消息,因此无法匹配cookie以确保Session Affinity,也无法注入特殊的X-Forward标头。
在这种情况下,Socket.io仍然可以工作吗? 或者还有另一种方法在负载均衡器后面使用SSL来配置一组Socket.io应用服务器?
编辑:蒂姆·卡斯韦尔在这里已经谈到了这一点。 有没有解释如何设置的帖子? 再次,这里没有会话粘性,但事情似乎工作正常。
顺便说一句,websockets实际上需要粘性会话吗? 信息是否作为新的和单独的请求传播,还是只有一个请求+连接,所有的信息都会移动?
您现在可以使用由AWS最近推出的新应用程序负载平衡器。
只需将ELB(现称为经典负载平衡器)替换为ALB(应用程序负载平衡器)并启用粘滞会话即可。
ALB支持Web套接字。 这应该做的伎俩。
https://aws.amazon.com/blogs/aws/new-aws-application-load-balancer/
http://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html
即使使用TCP ELB,Socket.io也无法使用,因为在将连接升级到websockets之前,它会发出两个HTTP请求。
第一个连接用于建立协议,因为socket.io支持的不仅仅是websocket。
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
第二个请求用于实际升级连接:
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=
您可以在上面的示例中看到xX_HbcG1DN_nufWddblv
是请求之间的共享密钥。 这就是问题。 ELB执行循环路由,意味着升级请求触及服务器,而不参与初始协商。 因此,服务器不知道客户是谁。
内存中有状态数据是负载平衡的敌人。 值得庆幸的是,socket.io支持使用Redis来存储数据。 如果您与多台服务器共享您的Redis连接,它们实质上共享所有客户端的会话。
有关设置Redis的详细信息,请参阅socket.io wiki页面。
正如我在文章中提到的,我们只使用ELB来终止和负载平衡跨越支持websockets的一组http代理服务器。 ELB不直接与websocket服务器通话。 HTTP代理群集处理查找正确的socket.io服务器以进行连接以确保会话粘性。
链接地址: http://www.djcxy.com/p/87155.html上一篇: Socket.io Websockets on a TCP configured Amazon Elastic Load Balancer
下一篇: Proxying WebSockets with TCP load balancer without sticky sessions