本文旨在讲述linux平台下利用epoll构建Reactor模型。所谓高并发就是:用尽量快的速度、尽量少的资源,干尽量多的活。所以需要条件如下:1.非阻塞IO;2.线程利用最大化。
epoll是linux平台提供的多路io复用技术(还有select/poll),其他平台有与其类似的接口。它的设计思想是:用一个阻塞监听多个io,避免了多个io阻塞多个过程调用。
最简单的网络编程模型有:多线程(每个连接创建一个线程),多进程(每个连接创建一个进程),但这样很多线程/进程只工作一小段时间,其他时间都是没事干的状态,资源利用率大大降低。
有了多路io复用epoll就好多了,它帮我们监测多个io端口,只需要阻塞在epoll_wait。广大的程序员建立了一个通用模型Reactor,方便了后台服务程序的开发。
《第一个级别》最简单的是单线程Reactor模式,即用一个epoll,放在一个线程,循环执行操作。负责①“接收新连接”、②“已有连接的io读写”、③“处理定时器任务”、④“处理实际的业务逻辑”,四部分工作。
首先是“接收新连接”,就是用Reactor监听Acceptor;如果有新连接到来,就将新连接的读写操作监听到Reactor;定时器任务不用启动新线程sleep,一个比较好的方案是将timerfd也放到Reactor监听;最后是处理实际的业务逻辑,不知道是谁创造的这个完美方案:如果有事件需要处理,就给Reactor发一个写操作(写8字节特殊字符),暂时中断它的wait,将它从io等待io中激活,去处理用户任务。这样一个线程就可以同时兼顾四项工作,将线程利用率最大化。
GitHub代码地址:......
《第二个级别》如果连接数非常大或者业务逻辑耗时较长,可以将①②放在一个线程,③④放在线程池操作,中间通过任务队列协调。如果还不能支撑,就将①放在一个线程,②放在一个线程,或者开多个线程用于接收连接和处理网络io,用于针对所谓的的高并发请求。
《第三个级别》如果一台电脑开线程到CPU的最合适数量,还不能够应付并发数量,就涉及到服务器集群了,多台服务器协同配合应对高并发。例如有:专门处理连接的服务器、处理网络io的服务器、处理业务逻辑的服务器、数据库服务器。怎么分配这些服务器的工作,怎么协调,怎么保证可靠性,就是专门的议题了。