1.都说要负载均衡,但是一开始的时候总得有一个服务器和客户端建立连接,并通知客户端和哪个负载服务器建立连接,或者把客户端的请求转交给负载服务器。那么一开始的大数据量的连接请求和数据传输是如何处理的?
我的猜测:是不是处理千万级的Tcp socket连接并不存在问题?这里有一篇文章。
还有一开始进行负载均衡需要传输的数据量比较少,所以也不存在问题?
2.面试的时候问到一个问题,怎么设计一个IM的登陆系统,同时处理千万级的并发登陆。如果我上面的猜想是正确的,那么是不是一台性能比较强的服务器就能处理登陆请求?因为登陆的数据量并不大。真正占用服务器资源的是登陆后的业务逻辑操作。
我把你的两个问题合并起来回答吧。
第一,你想的方向没问题,但是如果一个服务器同时维护千万级的TCP连接(即C10M Problem),是一件非常困难的事情,需要kernel支持/在用户态里实现TCP协议解析与Procedure调度减小开销。譬如如果你针对每一个连接开一个线程去处理,那么在常见的x86 Linux server每个线程上需要4k的空间,那么你至少需要数十G的内存来处理,还不算线程里需要给你程序开辟的空间。
第二,登录这个过程也许client发给server的数据包不大,但是server处理过程是需要耗时的(更新DB等)。和上面一点相似,所以不会把这个流程放在一个server里处理。
以上均没有考虑服务可用性等因素,你可以想象下如果这个这个server单点压力过大crash了该怎么办呢。