重复服务器(Iterative Server,迭代服务器/循环服务器)与并行服务器(Concurrent Server,并发服务器)是网络编程与服务端架构中两种经典的服务器处理模型。二者最本质的区别在于:服务器是否能够在同一时刻处理多个客户端请求。该分类体系由已故网络编程专家 W. Richard Stevens 在《UNIX 网络编程(第 1 卷)》中被系统阐述,至今仍是分析服务器体系结构的基础范式。

一、重复服务器(Iterative Server)
定义:服务器逐个、顺序地处理客户端请求。服务器从请求队列中取出一个请求,处理完毕并将响应返回给客户端后,才取下一个请求。在处理某一个请求期间,其余到达的请求只能在队列中排队等待(被阻塞)。
工作流程:监听端口 → 接受一个请求 → 处理该请求 → 发送响应 → 关闭连接 → 循环执行上述步骤,周而复始。
实现方式:通常由单进程、单线程的阻塞式循环构成,结构简单,不存在共享数据竞争问题。
优点:实现与调试简单;无进程/线程创建与切换开销;无同步、互斥与死锁问题;内存与 CPU 资源占用低。
缺点:吞吐量低;单个慢请求(长连接、大文件传输、计算密集型任务)会阻塞后续所有客户端,造成饥饿现象;无法利用多核处理器的并行计算能力。
适用场景:请求处理时间极短且无状态的服务,例如基于 UDP 的 daytime、echo、DNS 查询等简单协议,以及嵌入式设备、低并发的边缘服务。
二、并行服务器(Concurrent Server)
定义:服务器能够同时处理多个客户端请求,多个请求的处理逻辑在时间上重叠执行,后到的客户端无需等待前一个请求处理完成。
工作流程:主进程监听端口 → 接受一个连接 → 将该连接派发给一个独立执行单元(子进程 / 子线程 / 协程 / 事件回调)处理 → 主进程立即返回,继续接受下一个连接,多个执行单元并行运行、互不阻塞。
实现方式:主要有四类范式——多进程并发(fork 子进程,如早期 Apache prefork 模型);多线程并发(pthread 线程模型);I/O 多路复用的事件驱动并发(基于 select / poll / epoll 实现单线程内的逻辑并发,如 Nginx、Redis、Node.js);协程/异步并发(Go goroutine、Python asyncio、Kotlin 协程)。
优点:吞吐量高、响应时延低;慢请求不会阻塞其他客户端;可充分利用多核 CPU;适合长连接与高并发场景。
缺点:实现复杂度高;存在资源竞争、数据同步、死锁等并发安全问题;进程/线程创建与上下文切换存在开销;调试与排错难度大。
适用场景:TCP 长连接服务、高并发 Web 服务、数据库服务、即时通信、文件传输、微服务网关等对响应时延与吞吐量敏感的场景。
三、核心对比
请求处理方式:重复服务器串行处理;并行服务器并行处理。
客户端等待:重复服务器中后到客户端需排队等待;并行服务器中客户端几乎无需等待。
性能特征:重复服务器吞吐量受最慢请求制约(短板效应明显);并行服务器吞吐量随并发执行单元数量提升,但受 CPU 核数与 I/O 模型上限约束。
资源开销:重复服务器开销极小;并行服务器需为每个连接分配执行单元或事件资源。
实现复杂度:重复服务器低;并行服务器高。
四、工程演进与补充
在生产环境中,纯粹的重复服务器已较少单独使用,而纯粹的"每连接一进程/线程"模型也因开销过大而被优化。现代主流架构普遍采用混合模型:以 I/O 多路复用(epoll / kqueue / IOCP)实现单进程内的逻辑并发,再结合线程池 / 进程池(如 Nginx 的 worker 进程组、Netty 的 EventLoop、Go 的 GMP 调度器)兼顾并发能力与资源效率。此外,池化技术将"接收—分发"与"实际计算"解耦:主线程仅负责 accept 与任务分发,工作线程负责具体处理,从而进一步提升并行服务器的伸缩性与稳定性。

查看详情

查看详情