nginx的事件驱动模型


nginx的事件驱动机制:
    事件发生源产生事件->事件收集器来收集分发事件(选择自己感兴趣的)->消费事件.

传统web服务器(例如apache)的事件驱动机制:
    当一个连接到来时候,事件驱动,建立连接.当连接建立以后直到关闭之前进程将退化成按顺序执行每个操作的批处理模式.每个请求的始终占据资源,无论是否进行数据传输.尤其是中途的阻塞,会造成资源的极大浪费.这种传统的web服务器常常把一个线程或者进程作为一个事件的消费者,在进程阻塞的时候会休眠,而休眠占用的资源第不到有效的利用,并且当有上百万连接时候,进程(线程)间频繁的切换将成为服务器的瓶颈.

传统web服务器的瓶颈原因:进程切换占用过多资源+进程睡眠浪费资源
nginx解决之道:单个进程+多阶段异步处理
    nginx采用单个或者几个进程(一般是cpu的数目)来处理事件,这样就不会由于进程间的频繁切换而造成服务器的瓶颈,
    nginx采用多阶段异步处理,这样就不会造成进程睡眠而产生的资源浪费.

nginx的事件驱动+多阶段异步处理机制:
    nginx完全采用事件驱动架构来处理业务,他不同于传统的事件驱动模型.他不会为单个消费事件去创建一个线程或进程,他只是把消费事件当作一个模块,只有收集分发器才会占用资源,他们会分发某个事件时候调用消费模块使用当前占用的进程资源.
nginx多阶段的划分方法:
  1.将阻塞方法根据触发事件划分成多个阶段
    第一阶段:将阻塞方法转换成非阻塞方法,第二阶段将处理返回结果.
  2.将阻塞方法根据时间划分成多个阶段
    如果阻塞方法没有对应的非阻塞方法,并且阻塞方法消耗的时间是可测并且可划分的,那么->第一阶段分解阻塞方法划分成多个极短时间的阻塞方法,第二个阶段处理结果,并在一定情况下再次调用第一步.
  3.对于空转的情况,使用定时器解决.
  4.对于无法将阻塞方法划分的情况,只能将阻塞调用放在一个独立的进程,等到阻塞方法调用完成后在通知原进程.(慎用,这条违反了nginx的设计规则)

多阶段请求异步连接提高了网络性能,降低了请求延时.
(web影响并发的因素:睡眠+线程(进程)切换)
传统web与nginx的比较:
    传统web服务器的每个事件消费者独占一个进程(线程)资源,这种情况对于用户规模较小的情况来说,用户响应速度快,但是当并发规模达到数十万上百万的时候,由于线程(进程)数目过多,会频繁的切换,而且当线程阻塞的时候会进行睡眠,也会造成资源的浪费,这样服务器就会产生瓶颈.
    nginx服务器采用的事件驱动机制不同,他不会为每个消费事件创建一个进程或线程,这样就不会产生由于进程间频繁切换占用cpu而产生的瓶颈,而且nginx不会让事件阻塞,即采用无阻塞事件驱动模型,这样就不会因为事件阻塞使进程睡眠而造成的资源浪费.
      nginx将一个请求划分成多个阶段异步处理,每个阶段仅仅完成一个请求中的一部分,当本阶段任务完成后进入下一阶段.等待事件发生不是阻塞的等待,等待事件发生时候内核通知,在等待阶段继续处理其他任务.


nginx优点:
  对阶段异步处理+事件驱动机制可以是并发达到百万以上,极大的提高服务器的响应速度,增加了用户体验.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值