并发服务器有三种常见的架构:
1. 单线程epoll(ET非阻塞I/O) +线程池,也叫半同步半异步模式。这种模型比较常见,而且因为异步层和同步层使用消息队列传递消息,更容易实现对消息的FIFO处理。缺点就是线程的同步和上下文切换开销比较大。
2. ConnectionPerThread+阻塞型I/O。这是最古老的服务器并发模型,不太适合现今的这些高并发高负载服务器,当连接数巨大的时候,创建销毁线程的开销会无法承受,并且内核创建线程的速度也会成为瓶颈。这种模型的一种改进型就是领导者/跟随者模式,它吸取第一种模型中,线程数量不会膨胀的优点,使用线程池来处理连接。每当有连接到达时,都使用一个线程阻塞处理,处理完成后,线程再回到线程池中,这样有限的线程模拟出了ConnectionPerThread。一般来说,领导者/跟随者模型比第一种模型更加高效,因为它减少了线程同步和切换的开销,它的缺点就是FIFO很难保证。
3. 流水线模型。前面两种模式都有个缺点,它们不能花太长时间处理逻辑,因为在多CPU系统上,某些耗时的长请求可能会不断占住CPU,而导致短请求得不到处理,这会使某些CPU闲置。于是这种模型提出,将请求处理的过程划分步骤,不同的步骤考虑不同的资源处理(比如CPU, DISK I/O等),每个步骤使用单独的线程或线程池。这样比较耗时的操作可能集中在流水线的下级,而短请求也可以在上级得到快速处理。因为各级线程之间使用消息队列传递请求,也很容易实现FIFO。