如何在增加/删除服务器时缩放websocket连接负载?

时间:2019-03-30 23:16:15

标签: websocket architecture scaling autoscaling

解释问题:

使用HTTP:

假设每秒有100个请求。

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

由于每个连接的寿命都很短,因此在我添加/删除服务器时,每台服务器的负载会自动达到平衡。

使用Websockets

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

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

问题

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

然后如何有效扩展websocket和管理每台服务器的负载?

2 个答案:

答案 0 :(得分:0)

这类似于游戏行业长期试图解决的问题。在该区域中,您有许多并发连接,并且必须在许多客户端之间进行快速通信。

选项:

  1. 从站/主站体系结构,其中主站保持与从站的连接,以监视运行状况,负载等。当某人加入会话/应用程序时,他们对主站执行ping操作,而主站将响应下一个服务器。这是一种客户端负载平衡,除了使用服务器端启发式。

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

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

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

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

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

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

答案 1 :(得分:-1)

Websocket建立在TCP上,并且用于TCP。如果您有正确的请求路由算法,例如least outstanding requests,负载将自动在服务器之间平均分配。相反,如果轮流使用,则负载将不相等。

让我举3个实例(a,b,c)为例,每个实例有100个请求(每个大约33个连接),并且您要添加一个新框(d),可以说一段时间后新的100个请求进入(总共200个)要求),就位的情况下,旧箱子(a,b,c)的负载会进一步增加,因为每个箱子都有58个(33个现有+ 25个新)连接,而新箱子将有25个连接,这里的负载是不均匀的。

ROUND ROBBIN

a,b,c 58(现有33个+ 25个新功能)

d-25(25个新功能)

对于相同的情况,如果您有least outstanding requests,则所有方框都将具有连接数。

LEAST CONNECTION

a,b,c-50(现有33个+ 17个新功能)

d-50(50新)

删除实例同样适用,但是关键是负载将分散在不同的流量上,对于现有连接,除非您关闭任何实例,否则什么都不会发生。