我已经设置了节点服务器来保存日志信息。预计会有非常高的请求数量。我正在与mongo数据存储一起工作,但这种性能太不可靠了。阅读报道方面的数据往往需要很长的时间。所以我切换到一个经典的,MySQL。如果您准备批量插入而不是单点插入,显然有很大的写入吞吐量优势。所以,我发现这个家伙:node.js,可以通过外部请求修改运行函数中的变量
https://gist.github.com/3078520
我喜欢它的简单。它在几条线上,非常强大。它有两个主要功能add()
,它将向队列添加一条记录,然后在队列达到一定大小后再调用flush()
。然后它有flush()
其加入队列成一个长字符串,并创建一个长BULK INSERT语句时,再运到MySQL驱动(我简化,从提供的链接功能:
this.flush = function() {
/*1*/ var sql = queryTemplate.replace('{values}', '\n('+ queue.join('),\n(') +')');
/*2*/ handle.query(sql, callback);
/*3*/ queue = [];
}
这实质上是一种类函数是请求处理程序拥有的单个类实例的一部分,所以我的问题是,这是安全的吗?queue
是一个类变量,当调用flush()
时,它处理队列。调用flush()
,执行第1行以使sql语句(只是一个字符串),然后调用另一个add()
,它将某些内容添加到queue
,然后第一个进程调用query()
函数,然后清空队列。在这种情况下,由第二个进程添加的记录将会丢失,因为第一个进程在创建sql语句时不会知道它,并在清除queue
时将其清除。这可能吗?
这个问题的更概括的形式如下。一旦函数开始执行,其他任何东西都可以从外部影响其范围之外的变量?这里是一个非常简单的例子,就是它曾经可能做到在这个例子中,假设的console.log不同请求调用这两个函数:
var global_number;
function a(){
global_number=2;
}
function b(){
global_number=1;
if(global_number==2){
console.log("a() influenced global_number in the middle of b()'s execution")
}
}
这主要是/否的问题,但我正在寻找多一点。一个简单的解释或链接到一个页面,我可以学习更多将是伟大的!谢谢!
关于错误问题的好处,我不关心它,但记住它很好。除此之外,按照我描述的方式,数据丢失的功能是否安全?上面的答案在这方面并不十分清楚。 – Landon
第一句话是关于你的实际问题。不,这是不安全的,异步函数可以修改全局数据,而使用相同全局变量的所有其他进程都会受到操作数据的影响。 –
更新了答案,查看输出结果,您将轻松获得该技巧。 –