gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:00:59 26 4
gpt4 key购买 nike

我打算设置一组运行 Socket.io 的 NodeJS 应用程序服务器在 EC2 上,我想使用 Elastic Load Balancer在它们之间分散负载。我知道 ELB 不支持开箱即用的 Websocket,但我可以使用描述的设置 here in Scenario 2 .

the blog post 中所述,不过,我注意到此设置不提供 session 关联或源 IP 信息:

We can not have Session Affinity nor X-Forward headers with this setup because ELB is not parsing the HTTP messages, so its impossible to match the cookies to ensure Session Affinity nor Inject special X-Forward headers.

Socket.io 在这些情况下还能工作吗?或者有没有另一种方法在负载均衡器后面使用 SSL 设置一组 Socket.io 应用服务器?

编辑:Tim Caswell 已经谈论过这样做 here .有没有解释如何设置的帖子?这里再次没有 session 粘性,但事情似乎运行良好。

顺便说一句,websockets 真的需要粘性 session 吗?信息是作为新的独立请求传播的,还是只有一个请求+连接所有信息都在传播?

最佳答案

即使使用 TCP ELB,Socket.io 也不能开箱即用,因为它会在升级到 websocket 连接之前发出两个 HTTP 请求。

第一个连接用于建立协议(protocol),因为 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

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

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 是请求之间的共享 key 。这就是问题。 ELB 执行循环路由,这意味着升级请求会到达未参与初始协商的服务器。因此,服务器不知道客户端是谁。

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

socket.io wiki page有关设置 Redis 的详细信息。

关于node.js - TCP 配置的 Amazon Elastic Load Balancer 上的 Socket.io Websockets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13359503/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com