本文旨在讲述linux平台下利用epoll构建Reactor模型。所谓高并发就是:用尽可能快的速度、尽可能少的资源,干尽可能多的活。因此须要条件以下:1.非阻塞IO;2.线程利用最大化。linux
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的服务器、处理业务逻辑的服务器、数据库服务器。怎么分配这些服务器的工做,怎么协调,怎么保证可靠性,就是专门的议题了。高并发