node.js - 负载均衡 Amazon EC2 上的 Node socket.io

标签 node.js sockets amazon-web-services amazon-ec2

我有一个在亚马逊 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 调试会 400 套接字请求返回原因 {"code":1,"message":"Session ID unknown"},我猜这是因为它正在与另一个实例通信.

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

我该如何解决这个问题?我是否需要一个专门用于 Node 的完整实例?这似乎有点矫枉过正......

最佳答案

当您考虑 websocket 流量(第 4 层)和 HTTP 流量(第 7 层)在一次只能检查一层的负载均衡器上移动时,问题就出现了。例如,如果您将 ELB 设置为在第 7 层 (HTTP/HTTPS) 上进行负载平衡,则 websockets 将无法在整个 ELB 上运行。但是,如果您将 ELB 设置为在第 4 层 (TCP) 上进行负载平衡,那么任何回退 HTTP 轮询请求都可能最终到达任何上游服务器。

这里有两个选择。您可以想出一种方法来有效地平衡 HTTP 和 websocket 请求的负载,或者找到一种方法来确定地将请求映射到上游服务器,而不管协议(protocol)如何。

第一个非常复杂,需要另一个负载均衡器。 A good walkthrough can be found here .值得注意的是,在撰写该帖子时,HAProxy 没有原生的 SSL 支持。现在是这种情况,如果这是您想要走的路线,则可以完全删除 ELB。如果是这种情况,第二种选择可能更好。

否则,您可以单独使用 HAProxy(或 Nginx 的付费版本)来实现确定性负载平衡机制。在这种情况下,您将使用 IP 散列 since socket.io does not provide a route-based mechanism to identify a particular server like sockjs .这将使用 IP 地址的前 3 个八位字节来确定哪个上游服务器获得每个请求,因此除非用户在 HTTP 轮询之间更改 IP 地址,否则这应该有效。

关于node.js - 负载均衡 Amazon EC2 上的 Node socket.io,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29756331/

相关文章:

javascript - Node.JS 嵌入客户端模块

javascript - 如何在 Knex JS 中使用 IS NOT NULL

python - 通过 IPC 将二进制数据从 C 发送到 Python

java - 如何通过套接字将 jFrame 与 jTable 一起传递?

amazon-web-services - 如何按名称从 SageMaker Feature Store 中删除功能组

javascript - 比较两个对象数组并将具有匹配值的对象添加到第一个对象数组

javascript - WebRTC:匹配最近的对等点

node.js - 如何使用路径创建套接字连接

amazon-web-services - 实际上 Amazon S3 何时触发 Lambda

amazon-web-services - 通过 TaskCat 拒绝访问 S3