node.js学习---异步编程之事件监听

事件监听基本概念

1、事件驱动程序

当web server收到请求的时候,会将他关闭然后进行处理,接着就会去处理下一个请求。每当有一个请求完成,就把他拿出来放在处理队列的开头。

2、事件监听

事件监听广泛的用于异步编程(继承),理解为监听着特定的事件(订阅了一个事件监听),当发生了这个事件的时候执行其中的代码逻辑。那么就相当于发布-订阅模型,理解为监听着特定的事件表示为当前进程订阅了该事件(一旦有该事件发生就好像有人在订阅的频道上发布了一样),一旦触发了这个事件就好像发布了这个事件进行对应的逻辑处理。一个简单实例如下

var EventEmitter = require('events').EventEmitter; 
var event = new EventEmitter(); 
// 订阅,监听event1这个名字的事件
event.on('event1', function(msg) {  
    console.log(msg); 
}); 
//发布,触发了event1事件
setTimeout(function() { 
    event.emit('event1''触发了event1事件');   
}, 1000); 

注意点:基于健壮性考虑,诸如上面的on这样的监听器一般不允许超过10个,可能会导致内存泄漏。对于error的特殊对待,要不就在事件上对error添加对应的监听器,要不就需要在遇到错误的时候进行抛出。

3、once()利用事件队列解决雪崩问题

once():为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。
缓存雪崩:指对数据的多次并发访问数据库,导致数据库崩溃。
方法一:加状态锁

var select = function (callback) {
    if (status === 'ready') {
        status = 'pending';
        db.select('SQL', function (results) {
            callback(results);
            status = 'ready';
        });
    }
};

那么这里需要注意的是,如果是并发访问,只有一个请求拿到了锁,剩下的请求就不会去访问数据库,也就是只有一条对数据库的访问有效。
方法二:使用once()

var proxy = new EventProxy();
var status = 'ready';
var select = function (callback) {
    // 将该实例的该操作放入队列,并且操作只执行一次
    proxy.once('selected', callback);
    if (status === 'ready') {
        status = 'pending';
        db.select('SQL', function (results) {
            // 将该操作返回的数据作为回调函数的输入参数,执行回调函数
            proxy.emit('selected', results);
            status = 'ready';
        });
    }
};

利用事件驱动程序,将并发请求变成单线程的一个请求方式,每个请求都会订阅这个一次性的事件监听selected,压入事件队列进行等待。当第一个请求获取到锁之后,他会发布selected事件也就是处罚这个一次性的监听,从而将这个监听器就会被移除,这时候就可以继续执行在事件队列中的剩余请求。这样既保证了不会一次性有大量的并发请求到数据库,也保证了请求都可以被执行到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值