服务器模式

服务器开发貌似有固定的模式,性能和复杂度各异,现总结下常见的模式。当然服务器的开发并没有固定的模式,除了以下总结的外,实际根据业务的不同,生产中还用过其他模式。

  1. 阻塞式服务器
    主要特点:一个连接上来,等服务完毕后,才释放连接,在服务过程中,不能接收其他连接。一般而言此类服务的socket一般是阻塞的。此类服务器一般性能比较低的,基本上生产上不会用这种模式,只有在学习或做一些简单的测试才会使用这些模式。

  2. 迭代式服务器
    主要特点:一个连接上来,fork一个进程或创建一个线程进行服务,在一个服务的过程中,可以同时服务多个连接。一般来说,此类服务socket一般也是阻塞的。此类服务一般性能会比阻塞式服务器高很多,也有很多公司用这种模式,比如kugou的服务端。如果连接数比较大,C10K问题就非常明显,随着连接数的增加,性能剧烈下降。而且如果基本上是短连接的话,主动关闭会出现大量的TIME_WAIT或CLOSING_WAIT状态。

  3. 资源池的服务器 主要特点:预先启动一定数量的线程或进程,启动的数量根据实际的情况启动。每个连接来时,分配到空闲的线程或进程,也可以根据实际情况一个线程或进程处理多个连接业务,当无法找到空闲进程或线程时,可以动态增加线程或进程,socket可以是阻塞或非阻塞的。这类服务器需要预先估计服务器的承载能力。也有比较多的公司使用这种模式。当然会根据实际情况进行一些变化,比如说在服务器接一个前端,将前端的报文分发到消息队列,多个进程或线程竞争抢着处理。但本质上就是资源池的概念。nginx 貌似也是这种模式的,nginx还有一个先进的地方是多个进程同时linsten一个fd,Linux是允许多个进程同时监听一个端口的,当一个进程accept成功时,其他进程accept也会返回,这是群惊效应。自己很多年前也曾实现类似的服务器框架。jmm

  4. 非阻塞无状态服务器
    主要特点:一般都是单进程,采用epoll多路服务,对于动态数据,一般存在redis或一些分布是缓存中。一个进程可以接受多个连接,同时服务。当遇到性能瓶颈时,可以随便增加进程。一般这类服务器前端还可能接负责均衡器。现在一般都用这模式进行开发,性能比较可观,而且扩展非常方便。