Tag: 并发性

Node.js是成千上万人使用的Web应用程序的不错select,但是只有其中一些人才能访问相同的数据

我试图决定是否值得花时间投入学习Node.js的新程序。 AFAIU最大的好处就是Node让多个用户访问相同数据的过程比使用Apache和PHP更有效率。 该程序旨在被群体使用,所有的数据存储在我们的专用服务器上。 也就是说,同一个数据最多可以被一个组的所有成员访问(最多20个),但是数据库本身可能被任何使用该程序的人访问(为了好玩,假设多达100万)。 我的并发思想最好是基本的。 Node.js是否会改善组的体验(因为他们正在访问相同的数据),还是为每个人(因为他们正在访问相同的数据库)? 另外,这样的设置是否利用了Node的好处?

节点工作线程无法加载外部模块?

我试图在我的服务器上multithreading一个cpu密集型的工作。 我正在使用webworker线程。 Server.js :(相关部分) var Worker = require('webworker-threads').Worker; function doWork(req, res) { console.log("connection received"); var fibo = new Worker('plainworker.js'); fibo.onmessage = function (event) { res.json('fib(10) = ' + event.data); }; fibo.postMessage(10); } plainworker.js: var _ = require('underscore'); ///////////// <—- PROBLEM LINE function fibo (n) { return n > 1 ? fibo(n – 1) + fibo(n […]

并行数据库请求从Node.js SDK到Couchbase

我希望能够在短时间内向Couchbase商店发出几个Get请求,比如在半毫秒内。 我不能使用multiGet,因为我没有同时拥有所有的密钥。 但是,如果我很快发出了几个单独的获取请求,我相信他们将一次处理一个,如http://docs.couchbase.com/couchbase-devguide-2.5/index.html#retrieving-多键 。 我可能做的一件事情是在启动时为每个Get请求创build一个单独的Connection对象,但是我没有看到在任何地方推荐这个最佳实践。 这样的工作,即允许我快速并行获取并且是推荐的事情吗?

是sqlite的last_insert_rowidprimefaces?

我使用node.js sqlite3来操纵数据。 我使用这些代码插入数据到数据库,并获得插入ID: db.run("INSERT INTO myTable (name) VALUES ('test')"); db.get("SELECT last_insert_rowid() as id", function (err, row) { console.log('Last inserted id is: ' + row['id']); }); 我觉得这不太稳定。 我的数据库连接总是打开。 当我的服务器在来自客户端的多个同时连接上提供此代码时, SELECT last_insert_rowid()是否正确地获取id? 是sqlite的last_insert_rowidprimefaces? 谢谢。

node.js + mongo +多个实体的primefaces更新=头痛

我的设置: Node.js的 Mongojs 包含两个集合的简单数据库 – 库存和发票。 用户可以同时创build发票。 发票可能涉及多个库存项目。 我的问题: 保持清单的完整性。 设想一个情景是两个用户提交两个重叠项目集的发票。 天真(错误的)实现将执行以下操作: 对于发票中的每个项目,从库存集合中读取相应的项目。 修复库存项目的数量。 如果任何物品数量低于零 – 放弃与相关消息的请求给用户。 保存库存项目。 保存发票。 显然,这个实现是不好的,因为这两个用户的行为将会交错并相互影响。 在典型的阻塞服务器+关系数据库中,这是通过复杂的locking/事务scheme解决的。 什么是nodish + mongoish方法来解决这个问题? 有没有node.js平台为这些东西提供的工具?

如何确保在ElasticSearch盆景免费实例中使用Firebase FlashLight为每个对象build立索引

感谢FlashLight https://github.com/firebase/flashlight教程,这对于使用Firebase进行全文search非常简单。 但是,如果保留免费的ES实例,并发访问将受到限制,当您启动节点应用程序时,会在日志中看到以下消息: 无法索引firebase / xxx / -KHLhdwGplb3lHWjm8RS:错误:超出并发请求限制。 请考虑批量处理您的请求,或联系support@bonsai.io寻求帮助。 如何解决这个问题?

nodejs并行callbackdevise模式

我试图find一个很好的模式来执行一堆并行任务。 让我来定义一些任务来举例说明。 任务a, b, c, d, e, f, g执行为a(function(er, ra){//task a returned, ra is result}) ,所以b到g 还有一些任务应该在某个任务完成后执行,我们称它们为ab, bc, abc, bd, bcd, af, fg ,表示当a和b返回ab(ra, rb)应该一次执行,当b和c返回时,应立即执行bc(rb, rc) ,如果a , b , c全部返回,则应执行abc(ra, rb, rc) 。 对于最简单的情况,如果只有a和b ,我可以这样做: (function(cb){ var count = 2, _ra, _rb; function update(){if(–count == 0) cb(null, _ra, _rb)} a(function(er, ra){_ra = ra; update()}); […]

限制Q承诺Node js中的并发

有什么办法可以限制在js中一次执行的并发Q promise的数量吗? 我正在build立一个networking刮板,它必须要求和parsing更多的3000多页,并没有扼杀一些请求我没有响应的时间,所以连接rest和所需的响应(HTML代码)变得不可用。 为了对付这个问题,我发现限制了我的问题消失的请求数量。 我已经尝试了以下方法,但无济于事: Q承诺中的并发限制 – 节点 我怎样才能限制Q promise的并发性? https://gist.github.com/gaearon/7930162 https://github.com/ForbesLindesay/throat 我需要请求一个url数组,每次只做一个请求,当数组中的所有url都完成时,然后将结果返回给一个数组。 function processWebsite() { //computed by this stage urls = [u1,u2,u3,u4,l5,u6,u7,u8,u9]; var promises = throttle(urls,1,myfunction); // myfunction returns a Q promise and takes a considerable // amount of time to resolve (approximately 2-5 minutes) Q.all(promises).then(function(results){ //work with the results of the promises array […]

Node.js的http.request有什么性能? 它可以处理多less个并发请求?

我的node.js服务器使用最新的(0.4.8)http.request调用来调用另一个服务器。 我使用jMeter来运行负载testing。 每秒有50-100个并发线程,循环1000次。 当脚本继续运行时,我观察到一些减速。 我监测的networking吞吐量相当低,CPU和内存也很低。 而在另一台服务器上,日志显示他们的回应很快。 (毫秒)。 但是,我的node.js服务器中的console.log显示http.request响应时间从200-300 ms开始,到2000-3000 ms。 我不确定是否有可以并发http.request的限制。 请指教。 经过巨大的testing,我认为http.request的平均约300-400个请求/秒,ok服务器,maxSockets = 1024。通常,我看到每个请求的速度(连接到不同的网站)大约是80-100毫秒。

Node / Express:使用会话存储状态时的并发问题

所以我search了一下,发现了几个类似的问题,但都没有真正解决这个问题,所以我觉得这个问题本身就是值得的。 我有一个修改会话保持状态的一堆路由的快速应用程序。 事情是,如果有多个并行请求,由于请求之间的竞争条件,会话会不时被覆盖。 所以通常 … app.use(express.static('/public')); app.use(session(…)); app.route('methodA').get(function(req, res, next) { doSomethingSlow().then(function() { req.session.a = 'foo'; res.send(…); } }); app.route('methodB').get(function(req, res, next) { doSomethingElseSlow().then(function() { req.session.b = 'bar'; res.send(…); } }); 基本上这个问题很简单,例如在这个答案中描述。 Express将会话存储在res.end()中,但在处理methodA请求时,methodB请求可能会在此期间修改会话,以便methodA存储会话时将覆盖methodB所做的任何更改。 因此,即使节点是单线程的,并且所有请求都由同一个线程提供服务,只要有任何方法正在执行某种asynchronous操作,我们就可以最终解决并发问题,从而让其他请求同时处理。 但是,我正在努力决定如何着手解决这个问题。 所有我find的答案只列出了最小化发生这种情况的可能性的方法,例如通过确保静态内容不通过在会话MW之前注册服务静态MW来存储会话。 但这只是在一定程度上有所帮助; 如果实际上API方法应该被并行调用,那么需要一些实际并发的会话更新方法(IMO,当涉及到并发问题时,每个“解决scheme”都力求最小化发生问题的可能性而不是寻址实际问题肯定会出错)。 基本上这些是我目前正在探索的select: 完全通过修改我的客户端来防止在同一个会话中的并行请求,以确保它连续调用所有的API方法。 这可能是可能的,但会对我的架构产生相当大的影响,并可能影响性能。 它也避免了这个问题,而不是解决这个问题,如果我的客户端出了问题,或者另一个客户端使用了API,我可能还会随机遇到这个问题,所以它不会很健壮。 确保每个会话写入之前都有一个会话重新加载,并使整个重新加载 – 修改 – 写入操作成为primefaces。 我不知道如何做到这一点。 即使在修改和存储会话之前修改res.end()来重新加载会话,因为读取和写入会话是asynchronousI / O,似乎可能会发生这种情况: 请求A重新加载会话 请求A修改session.A ='foo' 请求B重新加载会话(并不会看到session.A) […]