长连接引入长连接,对应短连接。网上关于这两个的介绍很多。这里我们只用一张表来总结他们的工作。流程、优缺点、适用场景等:负载均衡和长连接为什么需要长连接和长连接的负载均衡单机的连接数是有上限的。之所以说上限,可能有同学会认为是单机端口数的限制,也就是经常听到的问题“一台服务器最多支持多少个TCP连接?”有人回答“65535”,但事实并非如此。如果不考虑硬件限制,单机可以支持超过200万亿个TCP连接,但这太理想化了。现实中,支持百万连接还是有可能的。从经验来看,CPU和内存是限制连接数的主要原因。内存就不用说了,每个连接占用一点内存,一个空连接也占几KB内存。如果再增加数据,几百KB到几MB也很常见,一个连接1MB算,一台128GB内存的物理机可以支持几十万个连接。第二个是CPU。上面我们说了,长连接的场景一般是单客户端操作频繁,每增加一个连接就会导致CPU消耗增加。一般单机能支持10万个连接,算是可以接受的。基于单机性能和高可用容灾的考虑,在生产环境中通常会部署多个节点用于长期连接服务。为此,我们需要考虑长连接服务的负载均衡问题。长连接的负载均衡粒度与短连接的每次请求的负载均衡策略不同。长连接不仅有请求粒度的负载均衡,还有连接粒度的负载均衡。请求粒度负载均衡的实现是客户端与各个服务器建立连接,在发送请求时根据一定的负载均衡策略选择一个服务器进行请求;连接粒度负载均衡是客户端在建立连接时,根据一定的负载均衡策略选择一个节点建立连接,后续的请求都发给这个节点。如何选择主要是考虑单台服务器可能的连接数。如果连接数远未达到瓶颈(个人认为在10000以下),可以考虑请求粒度,否则连接粒度的负载均衡策略更好。例如,Dubbo中的一个Provider节点已经与订阅Consumers的所有节点建立了连接。前提是Dubbo中一个Provider不太可能被上万个节点消费,所以Dubbo可以做请求粒度的长连接负载均衡。但是如果是Nacos,所有需要服务发现的机器都要和Nacos服务器建立连接。长连接的数量与公司服务器的数量级有关。大规模的情况下,几万、几十万、几百万也是有可能的,所以如果Nacos也像Dubbo那样设计的话,是无法支持大规模的服务发现的。连接粒度负载均衡对于长连接来说,连接粒度负载均衡问题遇到的比较多,这里着重讲解一下。连接数是平衡的。连接建立后,除非有异常,否则不会断开连接,那么问题就来了。如果某个节点的连接数远高于其他节点,这就是不平衡。出现此问题最常见的情况是服务器端释放(重启)。当重启时服务不可用时,该节点原来的连接会断开,寻找一个存活的节点进行连接。当服务启动时,它的连接数会非常少。如果是一轮释放,先释放的机器最后连接数最多,最后释放的机器连接数最少。这种情况下,我们可以将建立连接的负载均衡算法调整为最小连接数模式。服务重启后,后续所有连接都可以连接到这个节点。但是这个方法并不总是有效,因为当服务重启的时候,断开的连接已经和其他节点建立了连接。这时候我们可能需要额外的平衡手段,比如定期从全局的角度检查各个节点的连接数是否平衡,如果不平衡就断开连接数最多的节点,直到平衡。这里我们的客户端需要非常小心连接的断开,当然我认为这是必要的。但也需要注意的是,如果长时间不保持连接,可能不需要额外的均衡手段,过一段时间就会自然平衡。在什么情况下会发生这种情况?比如在公网长期连接中,客户端的网络状况不如内网,经常会掉线,相当于自动帮我们顺利连接。如果是内网服务,可以一直保持连接,需要额外的平衡措施。服务器规格不同。我们通常使用物理机来部署服务,目的是为了在单机上维护更多的长期连接。有时每台物理机的规格并不统一。如果我们的均衡方法一视同仁,每个节点的连接数都差不多,规格不好的服务器可能压力比其他机器大。因此,建立连接的负载均衡算法和额外的均衡方法也应该考虑服务器规范。可以简单地将服务器规格和当前连接数抽象成一个权重,然后在客户端建立连接时选择权重。无效扩展的问题我们的长连接服务应该是水平扩展的。如果连接数增加,我们可以直接增加机器,我们的大部分设计都是一样的。但有时你可能粗心大意,导致横向展开无效。例如,它仍然是一个注册中心。假设有一个注册中心集群,有3个节点。此时有1w个客户端连接并订阅了各种服务。由于客户端数量远大于注册中心节点,基本上可以认为每个注册中心节点订阅的服务是相似的,每个注册节点都要处理每个服务的变化,自然会消耗更多的CPU.如果注册中心节点扩容到5个单元,其实每个服务只是连接少了一点,但是每个注册中心节点还是要处理几乎所有的服务变化。在这种情况下,需要检查长连接服务的设计是否合理。一般采用分层思维。长连接层的服务只专注于推送。一般称为通道层或会话层。它没有复杂的计算逻辑。如果设计有问题,短时间内无法修改,可以尝试根据服务订阅者的名字路由到特定的服务器节点,保证同一个Conusmer只连接到一个注册节点,所以即当一个服务发生变化时,节点只需要计算一次,就可以推送给所有的Conusmers。运气好的话其他节点就不用计算了。结束语本文介绍了长连接和短连接的特点,为什么要做长连接负载均衡,以及长连接负载均衡的几个问题和解决方法。比较通俗易懂,希望对大家有所帮助。
