事件队列,将任务按序执行。
应用场景:最经典的是WEB中的事件编程,如下
<html>
<body>
function event1(){
// do event 1
}
function event2(){
// do event 2
}
<button type="button" onclick='event1();event2()'>Click Me!</button>
</body>
</html>
在上面的代码中 为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