服务器开发貌似有固定的模式,性能和复杂度各异,现总结下常见的模式。固然服务器的开发并无固定的模式,除了如下总结的外,实际根据业务的不一样,生产中还用过其余模式。前端
阻塞式服务器
主要特色:一个链接上来,等服务完毕后,才释放链接,在服务过程当中,不能接收其余链接。通常而言此类服务的socket通常是阻塞的。此类服务器通常性能比较低的,基本上生产上不会用这种模式,只有在学习或作一些简单的测试才会使用这些模式。linux
迭代式服务器
主要特色:一个链接上来,fork一个进程或建立一个线程进行服务,在一个服务的过程当中,能够同时服务多个链接。通常来讲,此类服务socket通常也是阻塞的。此类服务通常性能会比阻塞式服务器高不少,也有不少公司用这种模式,好比kugou的服务端。若是链接数比较大,C10K问题就很是明显,随着链接数的增长,性能剧烈降低。并且若是基本上是短链接的话,主动关闭会出现大量的TIMEWAIT或CLOSINGWAIT状态。nginx
资源池的服务器 主要特色:预先启动必定数量的线程或进程,启动的数量根据实际的状况启动。每一个链接来时,分配到空闲的线程或进程,也能够根据实际状况一个线程或进程处理多个链接业务,当没法找到空闲进程或线程时,能够动态增长线程或进程,socket能够是阻塞或非阻塞的。这类服务器须要预先估计服务器的承载能力。也有比较多的公司使用这种模式。固然会根据实际状况进行一些变化,好比说在服务器接一个前端,将前端的报文分发到消息队列,多个进程或线程竞争抢着处理。但本质上就是资源池的概念。nginx 貌似也是这种模式的,nginx还有一个先进的地方是多个进程同时linsten一个fd,linux是容许多个进程同时监听一个端口的,当一个进程accept成功时,其余进程accept也会返回,这是群惊效应。本身不少年前也曾实现相似的服务器框架。jmmgit
非阻塞无状态服务器
主要特色:通常都是单进程,采用epoll多路服务,对于动态数据,通常存在redis或一些分布是缓存中。一个进程能够接受多个链接,同时服务。当遇到性能瓶颈时,能够随便增长进程。通常这类服务器前端还可能接负责均衡器。如今通常都用这模式进行开发,性能比较可观,并且扩展很是方便。github