http服务器的技术策略

最近研究了一下nodejs的异步编程,看到关于nodejs作为web前端接入服务器的好评不断,不由得想起了其他几种常用的web服务器的技术策略,所以在这里想做个横向对比,看看nodejs的接入速度到底快在哪里。

1》apache(多进程提高并发处理速度)

每个客户端的http请求,服务端都要启动一个进程,来进行整个业务处理

任务划分的粒度最粗,只能切分到到进程级

依靠操作系统的进程调度来分配各个进程的运行时间片

进程无法跨CPU,一个进程只能在一个CPU上运行,多个CPU的话,无法充分利用CPU资源

2》tomcat(多线程提高并发处理速度)

每个客户端的http请求,服务端都要启动一个线程,来进行整个业务处理

任务划分的粒度比较细,可以切分到到线程级

依靠java的线程调度机制来控制各个线程的运行时间片,可以充分利用CPU资源

3》nodejs(事件驱动的异步编程提高并发处理速度)

一个主线程,一个事件循环线程,多个异步调用处理线程,具体分工如下:

1)主线程负责监听端口,接入http请求,执行同步调用,对于异步调用,快速返回,把任务直接打包扔进队列,由后台的线程具体执行,然后由事件循环线程进行回调。相当于饭店的服务员,只负责接待顾客,点完菜下单扔给厨师

2)异步调用处理线程有多个,这些线程就是具体干活的厨师,根据单子炒菜就行了,它不需要知道具体是哪个顾客点的,炒完菜通知跑堂的端菜就可以了

3)事件循环线程就负责回调,就是跑堂端菜的,把炒完的菜端到指定的桌子上就可以了

由此可以看出:

每个客户端的http请求并没有一个固定的进程或者线程为他服务

多个异步调用处理线程,处理的单位只是具体的某个异步函数调用

任务划分的粒度最细,可以切分到函数级,所以可以最大限度地利用CPU资源

总结:

nodejs的接入速度快的原因在于,通过异步调用把线程的处理单位分割到函数级别,让各个线程马不停蹄地干活,打破一个请求对应一个进程或者线程的界限,让各个线程的稼动率达到最高,从而提高处理速度。

如果apache和tomcat服务器也能实现异步调用的话,每个进程或者线程内部也尽可能多的利用异步方法的话,同样也可以达到nodejs的接入速度

nodejs大量使用异步函数调用,导致多个异步调用之间的相互协作以及同步变得异常复杂,如果系统庞大到一定程度的话,代码的组织和可读性,以及可维护性会大大降低,也会使得复杂度提升,使得整个系统驾驭起来会越来越难,对开发者的要求也会提高。

如果用nodejs构筑比较庞大的系统的话,优良的开发框架显得异常重要,否则开发效率会大大降低,所以nodejs目前看来不适合构筑庞大的系统,至少现在是这样,除非有优良的开发框架作为支撑。

个人感觉nodejs够快,但不够强壮,毕竟是初出茅庐,很多方面还需要时间去提升和打磨。

猜你喜欢

转载自blogzhoubo.iteye.com/blog/1695367
今日推荐