首页 > 代码库 > 常用服务器模型(转载)

常用服务器模型(转载)

 1)  迭代性服务器

        迭代性服务器,在开源社区的代表之作是Apache Web服务器。该模型中,存在唯一的侦听进程,侦听进程accept新的链接之后,通过fork的方式,派生出一个新的进程来为这个请求进行专门的服务,直至请求全部处理完成,被fork的进程也会自动退出,在服务过程中被占用的各种资源得以释放。

        这种服务器开发模型的优缺点分别如下:

        优点:

           开发流程比较清晰,对开发人员的要求比较低,对于内存泄漏、句柄未释放等各种请求服务器开发比较头疼的问题,随着业务进程自动销毁,全部都一了百了;

         缺点:

              每接受一次请求,均需要fork一个新的子进程,效率比较低,主要受限于机器fork进程的效率,不适合处理并发量比较大的情况; 

         使用场景:

                  迭代模型比较适合于请求并发量小,每次请求处理时间相对比较耗时的业务(业务处理流程比较复杂),例如处理图片上传等时耗比较长的业务。

           2)并发性服务器

          并发性服务器,顾名思义,同一时刻可以接受多个客户端的请求消息。这种模型的从实现方式来分主要有两种类型:多线程和多进程模型。在并发服务模型中,由主进程socketlisten等操作,然后fork出多个业务处理进程,每个业务进程在该socket上面进行accept操作,争相去获取该请求的处理权(实际上是由操作系统来进行客户端的请求分配一个正在等待的其中一个业务进程)。业务进程接收到客户端处理请求之后,开始进行具体的业务流程处理,待业务流程处理结束之后,又重新回到accept的位置,等待处理下一个客户端请求,按照这个流程周而复始,循环执行;

           这种服务器开发模型的优缺点分别如下:

           优点:

                    并发服务模型,并发处理客户端请求的能力有了很大的提升,也是在中度并发请求量的场景下比较常用的服务器模型; 

            优化改进版:

                   在实际开发过程中,可能会遇到业务进程发生内存泄漏、句柄泄漏、段错错误等不容易分析出来的场景,这种情况下,可以设定每个业务进程只处理多少次,到达指定的次数之后,自动销毁释放,父进程不断检测子进程的个数,当子进程的个数不符合需求时,由父进程重新fork出新的子进程来处理新的请求;

 

            3)  异步服务器

           归结命名为异步服务器模型,主要特征在于,该类服务器模型均使用网络异步模型select或者epoll等,使用异步网络模型的优势在于:单个进程(线程)可以同时等待多个socket的读写事件,大大的提高了网络操作的效率,目前来讲,网络异步模型尤其是epoll基本已经是高性能服务性的标配。开源社区使用网络异步模型典型有:Memcached(基于libevent)、RedisNginx等开源力作。

使用网络异步事件的典型是采用多线程模型,在单进程中,存在一个专门的侦听线程,负责整个服务中网络连接、可读、可写等事件的侦听,例如存在可读事件时,通知给具体的业务处理线程来进行处理。(参见文章的线程模型图片,http://www.iteye.com/topic/344172)。

           采用这种网络模型的优缺点分别为:

          优点:

                   网络操作高效,可以快速的处理海量网络请求的情况;

          缺点:

                   a)系统复杂度比较高,对开发人员的开发功底要求比较高;

                   b)业务代码与网络操作网络耦合在一起,一处出现问题,会导致满盘皆输;