说到nodejs的事件队列

  事件队列,将任务按序执行。

  应用场景:最经典的是WEB中的事件编程,如下



function event1(){
  // do event 1
}
function event2(){
  // do event 2
}




在上面的代码中 为button控件的onclick事件绑定了两个任务 event1,event2, 当用户用鼠标点击按钮,就会触发onclick事件,从而按序执行队列中的任务 event1->event2

 在后端编程中,也有事件队列的应用,用来在服务器性能峰值时,有效缓解服务器压力

1. 我们用nodejs的事件机制,解决雪崩问题

     雪崩问题,就是指在缓存失效的情况下,瞬间产生的对数据库的大量并发访问,导致数据库性能下降,进而影响整个网站的性能.

      以下为一段CoffeeScript代码

events =  require('events')
eq = new events.EventEmitter //得到一个事件队列的实例
queryLock = false //加入一个锁

_test = (cb)->
  unless queryLock
    queryLock = true
    sql = 'select id from user'
    connect.runSqlAll sql,(err,result)->
      cb err,result
      queryLock = false
      eq.emit('query',err,{'xx':'i am emit by eventQ'})//触发query事件
  else
    eq.once('query',cb)//将要执行的任务绑定到eq的query事件队列中,注:once代表仅触发一次

注意,在node的api上有这么一段话:

By default EventEmitters will print a warning if more than 10 listeners are added for a particular event. This is a useful default which helps finding memory leaks. Obviously not all Emitters should be limited to 10. This function allows that to be increased. Set to zero for unlimited.

每个eventEmitter对象的一个监听事件,  如果绑定的任务超过了10个,就会报一个warnning。所以这里需要调用emitter.setMaxListeners(n) 方法 修改他的默认事件个数


参考内容:

朴灵 : http://www.infoq.com/cn/articles/tyq-nodejs-event

http://nodejs.org/docs/latest/api/events.html


 
 

你可能感兴趣的:(说到nodejs的事件队列)