深入浅出NodeJS笔记(四)--- 事件订阅与雪崩问题

第四章 异步编程(一)

异步编程的主要解决方案有三种:

  • 事件发布/订阅模式
  • Promise/Deferred模式
  • 流程控制库

Node中广泛使用了事件发布/订阅模式。在Node提供的核心模块中,有近半数都继承自EventEmitter类,在Web服务器编程常用的Response对象即是如此。

雪崩问题:在高访问量、大并发量的情况下,如果缓存失效,大量的请求同时涌入数据库中,数据库服务器无法承担压力进而影响网站整体的响应速度。

利用EventEmitter提供的once方法,通过发布/订阅模式可以解决雪崩问题。once方法的特点是,通过它添加的侦听器只能执行一次,执行之后就会将它与事件的关联删除。代码如下:

var events = require('events');
var proxy = new events.EventEmitter();

var status = "ready";
var SQL = "select * from table1";

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

代码分析:

对于每一次查询,都会通过once方法订阅selected事件。当某个查询正在进行时,其他同时到达的查询处于pending状态,在订阅了selected事件后什么都不做,而请求的回调被压入事件队列中。当那个查询结束时,执行emit方法发布selected事件并更新状态。此时,那些订阅了selected事件的查询的回调函数被依次调用,并传入查询结果results作为参数。由于once函数的特点,每个查询的回调只会被执行一次。在执行回调的过程中,由于status变为ready,又可以响应其他的查询。

在这个过程中,只查询了数据库一次,其他的相同查询只是利用了这次查询的结果执行了回调而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值