Articles of 并发性

信号量等同于Node js,variables在并发请求中被修改?

我在过去的一个星期面对这个问题,我只是对此感到困惑。 保持简短的解释问题。 我们有一个内存模型,它存储像预算等值。现在,当一个API的调用它有一个与其相关联的花费。 然后,我们检查内存模型,并将花费添加到现有的花费,然后检查预算,如果超过,我们不会再接受该模型的更多点击。 对于每个调用,我们也使用db,但这是一个asynchronous操作。 一个简短的例子 api.get('/clk/:spent/:id', function(req, res) { checkbudget(spent, id); } checkbudget(spent, id){ var obj = in memory model[id] obj.spent+= spent; obj.spent > obj.budjet // if greater. obj.status = 11 // 11 is the stopped status update db and rebuild model. } 这用于工作正常,但现在与并发请求我们得到错误的花费增加超过预算,并在一段时间后停止。 我们用j米模拟了这个电话,发现了这个。 就我们所能看到的,当状态更新到11时,节点是asynchronous的,许multithreading已经更新了活动的花费。 如何为Node.js提供信号量逻辑,以便可变预算与模型同步 更新 db.addSpend(campaignId, spent, function(err, data) { campaign.spent […]

限制Node.js中同一主机的并发连接

为什么代码(或任何类似的) var http = require('http'); var async = require('async'); async.forever(function(next) { http.get('http://google.com', function(res) { next(); }); }); 最新发布的节点(0.10.28)只执行5次?

如何在node.js中创build后台单线程FIFO作业队列

我是一个JS /节点初学者,我试图让我的头绕着Javascript的“并发”的主题。 我觉得我现在对callback比较舒服,但我不认为这是我的scheme。 基本上我经常需要一个接一个地处理昂贵的任务( worker ),而main process继续工作。 这是一个最小的testing。 /* * We have a worker function that does some expensive task, eg, an * I/O task or something else. */ worker = function ( jobId ) { // It will take something between 1 and 2 seconds. var runtime = Math.floor((Math.random() * 1000) + 1000); console.log("started […]

Nodejs中的并发请求处理

我有一个并发请求的问题,它修改数据库。 我在做什么。 一个请求获取用户1的数据,然后计算用户1修改的logging中的字段1的数据,并保存。 下一个请求获取用户1的数据,然后计算用户1修改的logging中的字段1的数据,并保存。 两个请求都同时运行。 所以最后的请求更新错误的数据。 function calculate() { var needUpdate = false; user = new UserLib(user_id); var old_config = user.config; if (old_config[req.id]) { old_config[req.id].value = 0; needUpdate = true; } if (req.delete == void(0) || req.delete == false) { delete req.delete; old_config[req.id].value = old_config[req.id].value + 1; needUpdate = true; } if (needUpdate) { return […]

MongoDB数据库信号和Node.js Process.NextTick()

这可能是一个坏主意,也可能是一个数据库并发问题的解决scheme。 我们有一个被调用来更新mongologging的方法。 我们正在看到一些并发性问题 – 进程A读取logging,进程B读取logging,进程A做出mods并保存logging,进程做B mods并保存logging。 因为B在A之后读取,在A写入之前,它不知道A所做的更改,而我们从A中丢失数据。 我想知道是否我们不能使用数据库信号量,基本上是集合上的一个字段,这是一个布尔值。 如果我们在方法开始时读取logging,并且该字段是正确的,那么正在编辑它。 此时,使用process.nexttick()重新调用该方法,使用相同的数据。 否则,设置信号量,并继续。 阅读和保存之间还有一段时间,但是它应该比我们现在正在做的更快。 是这样的 任何想法,任何人都做了这样的事情? 它会甚至工作吗? function remove_source(service_id,session, next) { var User = Mongoose.model("User"); /* get the user, based on the session user id */ User.findById(session.me,function(err,user_info) { if (user_info.semaphore === true) { process.nextTick(remove_source(service_id,session,next)); } else { user_info.semaphore = true; user_info.save(function(err,user_new) { if (err) next(err,user_new); else continue_on(null,user_new); […]

将接收的实时dynamic数据推送给10,000个用户?

我正在对我正在开发的一个新项目提出一些指导,要求低延迟和高并发性。 该项目涉及从第三方供稿接收实时数据,经过一些基本处理和存储后,将这些值发送给网站上当前活动的所有用户。 数据通过HTTP Push到达,我目前的计划是使用Node.js接收这些数据,然后通过algorithm运行数据,然后更新某种数据库中的相关数据。 最后,更新通过websocket发送给网站的所有连接用户。 现在,我试图让这个可扩展性能够同时处理超过10,000个连接的用户,全部通过websocket连接,并且每3秒发送一次更新。 鉴于每个用户在此期间都可以与Web应用程序进行交互,这将导致许多请求来回。 现在,除了我所拥有的高层次的基本概念之外,决定将Ruby on Rails作为网站框架和节点j来处理它的“活力” – 我有点卡住了。 我不知道要使用什么样的数据库(我想这将是一个非关系数据库快速存储),我不知道如何构build这样一个设置的具体细节,以及如何实现逻辑。 所以我的问题是: 为了实现我的目标,我该如何构build这样一个应用程序,以及为了使其具有可伸缩性和实时性,我需要了解哪些内容? 非常感谢您的帮助。

Node.js中的响应顺序?

我已经阅读了关于Node.js和Event Loop的一些介绍性文章,但有一点是不清楚的 – 如果有多个并发请求,那么响应总是按请求的顺序连续的? 如果20个请求同时完成,那么第20个响应是否需要等待另外19个请求被清除(回复给客户端)? 更新:我想知道的是,这是否类似于多个setTimeouts排队?

创buildlocking,以便两个用户不使用相同的用户名创build帐户

我正在使用带有Node.js的Express服务器,并关心并发性,并防止用户同时创build具有相同用户名的帐户。 从我的underatanding,尽pipe主Node.js运行时是单线程的事实,它仍然是可能的一个function开始,而另一个尚未完成。 一种select是在Redis等外部源上创build一个锁,并使用它来控制并发 – 但是我的问题是 – 是否有一种可靠的方法来在本地JavaScript中控制这种情况? 例如,嵌套函数的某个级别基本上可以保证新请求在另一个完成之前不会启动某个调用(我怀疑它)。 更具体的说 – 我正在使用MongoDB的MongoDB。 使用Mongoose模式的内存中应该有唯一的用户列表。 那么会发生什么: (1)新用户使用用户名A进行注册 (2)node.js将A与索引的用户列表进行比较,发现A确实是一个新的用户名 (3)node.js进行数据库调用,将A添加到列表中 (4)之前(3)完成一个新的用户注册用户名A … node.js比较A与用户名索引,它看起来是唯一的,所以它发送一个插入数据库 这个问题似乎是真的。 我的猜测是解决这个问题的最好办法是外部locking。

在并发系统中做上下文logging是否有一个简洁的方法?

我的具体例子是Node.js,但我认为在任何基于事件循环的系统中都存在同样的问题。 考虑以下简单的应用程序: var logger = loggingmodule.Logger(); var server = http.createServer(function(req, res) { req.id = crypto.pseudoRandomBytes(10).toString('hex'); var log = logger.transaction(req.id); loadSomeAsyncData(log, function(err, data) { if (err) return bailout(err, req, res); doSomeAsyncAction(log, req.url, data.action, function(err, result) { if (err) return bailout(err, req, res); hydrateResultWithMoreAsyncData(log, data, result, onMoreData); function onMoreData(err, moreData) { if (err) return bailout(err, req, res); […]

如何testingnodejs并发请求

我想写一个简单的代码来testingnodejs并发性,当它收到很多请求。 我使用loadtest模块来模拟使用这个命令向服务器发送多个请求: loadtest -c 10 –rps 200 http://localhost:3000/ 我写在server.js中的简单代码: var http = require('http'); var server = http.createServer(); var cun=0; var step=0; function handleRequest(req,res) { console.log(step++); while(100000000>cun){ cun++; } cun=0; } server.on('request', handleRequest); server.listen(3000); 但是请求正在等待while循环closures 而且知道要解决这个问题我应该使用callback函数,但是不知道怎么写呢。