异步编程解决方案-事件发布/订阅模式

利用事件队列解决雪崩问题

所谓雪崩问题,就是在高访问量、大并发量的情况下缓存失效的情景,此时大量的请求同时涌入数据库中,数据库无法同时承受如此大的查询请求,进而影响网站整体的响应速度(《深入浅出nodejs》)

模拟数据库查询

var num = 0;
var select = function (callback) {
    setTimeout(function() {
        num++;
        callback("test");
    },2000)
}

select(function(res) {
    console.log(res+1);
});

select(function(res) {
    console.log(res+2);
});

select(function(res) {
    console.log(res+3);
});

setTimeout(function() {
   console.log(num);
},5000);
/* 结果
test1
test2
test3
3
*/

上述代码模拟了站点刚好启动时缓存不存在,同一条sql(查询得到test)会被执行多次。

增加状态码以限制访问次数

num = 0;
var status = "ready";
var select = function(callback){
    if (status === 'ready') {
        status = "pending";
        setTimeout(function() {
            num++;
            status = "ready";
            callback("test");
        })
    }
}

select(function(res) {
    console.log(res+1);
});

select(function(res) {
    console.log(res+2);
});

select(function(res) {
    console.log(res+3);
});

setTimeout(function() {
   console.log(num);
},5000);

/* 结果
 test1
 1
 */

此时,查询次数虽然限制成了1次,但是多次select语句只有第一次生效。

引入事件队列

num = 0;
var events = require('events');
var proxy = new events.EventEmitter();
var status = "ready";
var select = function(callback){
    proxy.once("selected", callback);
    if (status === 'ready') {
        status = "pending";
        setTimeout(function() {
            num++;
            status = "ready";
            proxy.emit("selected","test");
        })
    }
}

select(function(res) {
    console.log(res+1);
});

select(function(res) {
    console.log(res+2);
});

select(function(res) {
    console.log(res+3);
});

setTimeout(function() {
   console.log(num);
},5000);

/* 结果
 test1
 test2
 test3
 1
 */

此时所有的select语句都得到了查询返回的数据,且查询次数为1,达到了我们的预期
更多详见:http://www.paradeto.com

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,958评论 18 399
  • 这部分主要是开源Java EE框架方面的内容,包括Hibernate、MyBatis、Spring、Spring ...
    杂货铺老板阅读 5,292评论 0 2
  • 一. Java基础部分.................................................
    wy_sure阅读 9,262评论 0 11
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 11,160评论 0 4
  • 跑了好久好久,有意识以来就没有停过,没有时间的概念,因为永远存在。 这一片地势平缓,行程缓慢了一些。开阔,绕过的这...
    nyua阅读 2,629评论 0 2