Socket通信探索(二)-socket集群

  前面咱们在章节“Socket通信探索(一)”中如何实现一个tcp链接,可是这仅仅是一个最初级的BIO实现,且没有添加线程池,实际应用中不多采用这种方式,由于不得不考虑当大量的Tcp链接创建的时候,服务端如何安全稳定的运行?为何呢?html

  一、BIO实现方式,是阻塞式的(上一节最后面的实现方式虽然无数据的时候,不会阻塞);web

  二、服务端为每条链接都开辟了一个线程进行处理,并且在链接不断开的状况下,线程不会获得释放;安全

  基于以上状况,当有大量的链接创建的时候,服务端会开辟大量的线程处理并得不到释放,而线程会占用系统资源,这样就会致使系统资源耗尽,没有系统资源的链接请求将会等待处理,更甚至程序直接崩溃,因此最直接的方式是添加线程池防止程序崩溃,大量的链接的处理则还还须要另想他法。服务器

  你们都知道当web应用面临大量的请求时,咱们会对其进行集群或分布式等方式部署,同理,咱们也能够对socket服务端进行多处部署。负载均衡

  一般,因为Tcp链接中客户端须要知道服务端的IP跟端口,那么这就意味着客户端须要知道全部的目标服务器的地址和端口,若是有那么一台主机专门用于对咱们的服务器进行负载均衡,而后将负载均衡完成后选择的地址跟端口返回给客户端,而后客户端再发起真实的链接请求。具体的请求过程以下图(详细请参考:https://wenku.baidu.com/view/d5769f85d4d8d15abe234e7c):socket

  

  以上图中的virtual server实际上就是一个负载均衡用的服务器,全部客户端都会优先链接此服务器获得真实服务器链接(real server);该模型具体的通讯流程以下:tcp

    ①client向处于侦听的vs发SYN包;分布式

    ②VS按照调度策略选择一个RS,并向RS发SYN包;线程

    ④RS响应VS的SYN请求,将SYN ACK包返回给VS;server

    ④VS将收到的SYN ACK包发给client;

    ④client将5次握手的最后一个ACK包直接发给RS,此时client进入已创建链接状态,RS在收到ACK包后也进入已创建链接状态

    ⑥client和RS直接通讯,此过程与VS无关。

  经过以上模型便可完成TCP服务端集群部署,至于具体的实现过程,不在本篇的范畴以内,就目前来讲,我只了解这一种实现方式,若是还有其余的方案,你们能够相互交流……

相关文章
相关标签/搜索