解释问题:
假设每秒有100个请求。
由于每个连接的寿命都很短,因此在我添加/删除服务器时,每台服务器的负载会自动达到平衡。
假设有100个客户端,2个服务器(位于LB后面)
由于websocket连接是持久的,因此在客户端决定重新连接之前,添加/删除服务器不会增加/减少每个服务器的负载。
然后如何有效扩展websocket和管理每台服务器的负载?
答案 0 :(得分:0)
这类似于游戏行业长期试图解决的问题。在该区域中,您有许多并发连接,并且必须在许多客户端之间进行快速通信。
选项:
这可以防止您的客户端破坏一台服务器。建立WS连接之前,必须让客户端轮询主服务器,但这很简单。
这样,如果需要,您还可以扩展到多主机,并将它们放在负载均衡器后面。
如果您需要在服务器之间发送消息,则有很多选项(自己处理,队列等)。
这就是我去年构建的Android绘画应用程序Pixmap的工作方式。效果也很好。
客户端负载平衡,其中客户端连接到随机主机名。这就是Watch.ly的工作方式。为了安全起见,每个主机都可以成为自己的负载平衡器和服务器集群。冒险但简单。
传统负载平衡-即循环轮询。难以击败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新)
删除实例同样适用,但是关键是负载将分散在不同的流量上,对于现有连接,除非您关闭任何实例,否则什么都不会发生。