再次声明,这里的大部分文章都是我从我baidu的博客上转过来的,那里专业人士比较少,以后新的文章都会发表在这里。
用了点时间把我的webserver的基本架构图大致描述了出来,一则为了自己有个更为清晰的认识,二则为那些在服务器架构方面有要求有想法的人提供一点参考。
总体来讲架构的思路就是利用linux的socket或者文件fd的唯一性来避免全局竞争锁的出现(可能liunux内内部在分配的时候已经采用了锁), 这样我只要保证每次同一个fd只出现在一个环节的其中一个线程中就不会导致全局锁,这样就可以在系统性能方面提供一个伪耦合的架构,多个环节均采用任务调 度器来进行,这样当系统出现瓶颈的时候就可以加大那个环节的线程数量来解决,外部还是通过epoll的事件机制处理,这样就可以达到比较理想的动态处理速 度,又不会影响静态处理速度,其实IOCP内部也似一个线程池来解决的异步IO,只有把每个环节需要IO的部分都打散才能够保证系统的整体性能,并且不会 因为一个调度的失败影响全局的进程,总体结构图如下:
其中在读的环节见如下图表:
服务端处理见如下:
这样总体的系统就可以在server处理环节开展更为灵活的扩展方式,类似apoache的是将协议、网络等底层的处理部分全部封装,然后保证性能 和稳定性的前提下对中间环节进行扩展,这样可以避免fastcgi的引入,以求达到更高的服务器端性能。当然我的总体服务是一个类似于sop的纯XML+ 数据库+全文索引的模式,正因为如此才可以将设计全部局限于一个应用之中。
这是最原始的架构图,现在已经做了很多改动,不过任务调度器还是挺合理的一个工具,只是他跟epool有同质冲突,所以现在的改动全部是基于事件驱动,不过这种架构也能跑出比Nginx更高性能的web 服务器。