我们正在尝试设计一种能够处理超过 64k 个 websocket 的架构。
我们首先尝试使用 Amazon ELB,但它的设计不允许意外的流量峰值和 websocket。(TCP 模式意外超时 websockets)
使用 HAProxy,这些限制不适用,但我们将限制在 HA 和后端服务器之间维护的 ~64k websockets。
想到的多种解决方案:
- 多个 HAProxy 实例,使用 DNS 进行负载平衡(Route53 具有加权选项)
- 两个具有 Keepalived、多个内部 IP 地址的 HAProxy 实例(不确定是否可行)
有一个更好的方法吗 ?
如果您的 64k 限制是由于源端口造成的,您可以执行以下操作(有点骇人听闻,但这是我们目前在 SE 为 websockets 做的事情(我们通常与 HAProxy 有 50 万并发):
使用keepalived也可以实现多个实例。只需在多个 IP 上执行类似循环 DNS 的操作。只需确保 IP 始终被活动负载平衡器拾取,因为 DNS 本身不会为您提供负载平衡(这里还有更多选项,这个很简单)。
您可以使用 Anycast 和 BGP 或其他一些边界路由协议设置多个共享相同 IP 的 HAproxy 系统。这样所有的 HAproxy 系统都处于活动状态;如果其中任何一个出现故障,您将停止在该系统上发布 BGP 路由,它将在约 30 秒内停止接收流量;这将被重新分配到其他宣传相同范围的可用系统。
例如检查这个url 如何设置这样的布局