如何在添加/删除服务器时扩展 websocket 连接负载?

pde*_*eva 6 architecture scaling websocket autoscaling

解释这个问题:

使用 HTTP:

假设有 100 个请求/秒到达。

  1. 如果有 4 台服务器,负载均衡器 (LB) 可以在它们之间平均分配负载,每台服务器 25/秒
  2. 如果我添加一台服务器(总共 5 台服务器),LB 会更均匀地将其平衡到现在每台服务器 20/秒
  3. 如果我删除了一台服务器(总共 3 台服务器),LB 会将每台服务器的负载降低到每台服务器 33.3/秒

因此,当我添加/删除服务器时,每台服务器的负载会自动平衡,因为每个连接的生命周期都很短。

使用 Websocket

假设有 100 个客户端,2 个服务器(在 LB 后面)

  1. LB 最初平均平衡每个传入连接,因此每个服务器有 50 个连接。
  2. 但是,如果我添加一个服务器(总共 3 个服务器),第 3 个服务器将获得 0 个连接,因为现有的 100 个客户端已经连接到 2 个服务器。
  3. 如果我删除一台服务器(总共 1 台服务器),所有这 100 个连接都将重新连接,现在由 1 台服务器提供服务。

问题

由于 websocket 连接是持久的,添加/删除服务器不会增加/减少每个服务器的负载,直到客户端决定重新连接。

那么如何有效地扩展 websockets 并管理每台服务器的负载?

win*_*rid 1

这与游戏行业长期以来一直试图解决的问题类似。这是一个有许多并发连接的区域,并且必须在许多客户端之间进行快速通信。

选项:

  1. 从/主架构,其中主服务器保留与从服务器的连接以监视运行状况、负载等。当有人加入会话/应用程序时,他们会对主服务器执行 ping 操作,并且主服务器会使用下一个服务器进行响应。这是一种客户端负载平衡,除非您使用服务器端启发式方法。

这可以防止您的客户端炸毁单个服务器。在建立 WS 连接之前,您必须让客户端轮询主服务器,但这很简单。

这样,如果需要,您还可以扩展到多主机,并将它们放在负载均衡器后面。

如果您需要在服务器之间发送消息,有很多选择(您自己处理、队列等)。

这就是我去年构建的 Android 绘图应用程序 Pixmap 的工作原理。效果也很好。

  1. 客户端负载平衡,客户端连接到随机主机名。这就是 Watch.ly 的运作方式。为了安全起见,每个主机都可以成为自己的负载平衡器和服务器集群。有风险但简单。

  2. 传统的负载平衡 - 即循环法。很难击败 haproxy。这应该是您的第一个方法,并将扩展到数千个并发用户。但并没有解决重新分配负载的问题。通过此设置解决此问题的一种方法是将事件推送给您的客户端,告诉他们重新连接(并且每次尝试重新连接时都设置随机超时,这样您就不会杀死服务器)。