1. 单进程同步IO(迭代服务器)
server每次accept一个请求,收包,完成业务处理逻辑后回包,完成整个请求的处理后,才能继续接入下一个请求。这种server模式仅适用于业务处理
2. 父进程+动态创建子进程
父进程accpet连接,有新连接到来时fork一个进程,然后继续accept,等待新的连接。业务逻辑由子进程处理,处理完后子进程exit,每个子进程只处理一个连接。由于父子进程共享accept操作返回的连接fd,因些子进程可以方便的拿到connfd并进行收发数据包的操作。
大致伪代码如下:
3. 预创建进程池-子进程竞争accept,有惊群效应
父进程启动后预先prefork一部分子进程,子进程都阻塞在accept,有新连接到来时,子进程竞争accept,竞争到的子进程负责这一次的业务逻辑处理,处理完成后继续阻塞在accpet上。
可以使用锁进行同步,以避免惊群效应。
4. 父进程+预创建进程池, 父进程accept,子进程负责处理,规避了惊群效应
父进程可通过管道的方式传入套接字给子进程,并且父进程需要维护子进程当前状态,根据UNP1测试,这种方式性能较差。
5. 单进程IO复用
采用select/poll/epoll等IO复用技术,只使用一个进程,当有请求可读时,读请求并处理,处理后回包,这种服务器仅适合小包请求比较多,并且业务逻辑处理不需要阻塞的服务器。
6. 单进程接入+处理子进程池
使用IO复用技术启用proxy进程负责收发包,收到的请求放到共享内存或管道中,处理子进程池中每个进程都阻塞于读管道请求上,一旦有请求到达,读请求,处理完成后写回管道中,由proxy回包给客户端。