负载均衡 Amazon EC2 上的节点 socket.io

2024-02-08

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

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

我该如何解决这个问题?我需要一个专门用于 Node 的完整实例吗?这似乎有些过分了……


当您考虑 websocket 流量(第 4 层左右)和 HTTP 流量(第 7 层)在一次只能检查一层的负载均衡器上移动时,就会出现问题。例如,如果您将 ELB 设置为在第 7 层 (HTTP/HTTPS) 上进行负载平衡,则 Websockets 将根本无法在 ELB 上工作。但是,如果您将 ELB 设置为第 4 层 (TCP) 上的负载平衡,则任何后备 HTTP 轮询请求都可能最终到达任何上游服务器。

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

第一个非常复杂,需要另一个负载均衡器。可以在这里找到一个很好的演练 https://medium.com/@Philmod/load-balancing-websockets-on-ec2-1da94584a5e9。值得注意的是,当撰写该文章时,HAProxy 没有本机 SSL 支持。既然是这种情况,如果您想要走这条路线,则可以完全删除 ELB。如果是这种情况,第二种选择可能会更好。

否则,您可以单独使用 HAProxy(或 Nginx 的付费版本)来实现确定性负载平衡机制。在这种情况下,您将使用 IP 哈希由于socket.io不提供基于路由的机制来识别特定服务器(如sockjs) https://github.com/sockjs/sockjs-node#sticky-sessions。这将使用 IP 地址的前 3 个八位字节来确定哪个上游服务器获取每个请求,因此除非用户在 HTTP 轮询之间更改 IP 地址,否则这应该可以工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

负载均衡 Amazon EC2 上的节点 socket.io 的相关文章

随机推荐