2016-04-25 33 views
11

播放框架建议,以中继阻止IO到适当大小的线程池,如行为:游戏框架和Node.js的无阻塞关系数据库

https://www.playframework.com/documentation/2.5.x/ThreadPools

这是关系数据库访问的情况下因为没有可用的非阻塞JDBC驱动程序(极少数例外)

我目前正在学习Node.JS,我无法弄清楚这是如何在节点中处理的。我没有看到任何需要编写关于节点中线程池的代码。

那么,node.js中使用的关系数据库驱动程序是否能够执行非阻塞IO?或者这些计算是否在幕后被传递给某种工作者线程?

从更广泛的意义上说:什么是编码非常密集的数据库(关系)的node.js应用程序的正确方法?

+0

有一篇关于你可能喜欢的文章(https://engineering.linkedin。com/play/play-framework-async-io-without-thread-pool-and-callback-hell) –

+0

看看这个问题,它可能有助于理清你对节点如何工作的理解,但要回答你的问题,我知道的所有节点数据库驱动程序使用非阻塞io接口/ libuv异步事件循环...你不应该担心在应用程序级别实现:http://stackoverflow.com/questions/14795145/how-the-single-threaded-non-blocking-io-model-works-in-node-js – photoionized

回答

2

我想你基本上回答了你自己的问题:在nodejs中,你不必根据线程池等进行编码。 Play中的数据库线程池是Java JDBC API固有的。纯粹的nodejs数据库驱动程序在设计上是异步的。 nodejs包装器驱动程序的体系结构取决于包装库的体系结构。

的答案更广泛的问题是:

没有你如何编写DB中的NodeJS或Java密集型应用,因为很可能你的瓶颈将是你的DB背后持久存储与平台无关的相差无几。但是,在异步架构:

  1. 更自然的设计并不在DB放缓的情况下,过多的负载

  2. 压倒你的数据库系统,应用程序本身通常不会要求更多的系统资源

一个好的数据库驱动程序可让您通过托管连接池,每个查询超时,每个连接查询队列实现上述要点。尽管其中一些也可能是本地数据库接口的一个功能。

3

节点是单线程的,所以没有用户线程池[1]。相反,您需要使用更多节点服务器进行水平伸缩。您可以在Node应用程序中执行此操作:https://devcenter.heroku.com/articles/node-concurrency

另一方面,我使用async-JDBC-ish postgresql-async驱动程序获得了很好的成功。我用它jdub-asyncscalikejdbc。这里是一个博客,我就用它scalikejdbc写道:https://www.jamesward.com/2015/04/07/reactive-postgres-with-play-framework-scalikejdbc


[1]用户代码运行单线程(但你可以使用网络工作者有线程),然而libuv是多线程的。阅读更多:How the single threaded non blocking IO model works in Node.js

+0

node.js的mysql模块可以根据https://www.npmjs.com/package使用连接池/ mysql#pooling-connections 也许node.js为此使用内部线程池? – Renan

+0

下面是另一个补充说明,指出node.js是多线程的(但是,您的代码运行在单个线程中): http://rickgaribay.net/archive/2012/01/28/node-is-not- single-threaded.aspx – Renan

+0

是的,libuv有一个线程池,所以网络IO可以具有并发性。但即使你有一个连接池,这并不意味着你每个连接都有一个线程。查看:https://www.future-processing.pl/blog/on-problems-with-threads-in-node-js/ –