Play Framework和Node.js关系数据库的非阻塞行为

时间:2016-04-25 00:04:30

标签: node.js performance playframework threadpool

Play Framework建议将阻塞IO中继到适当大小的线程池,如:

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

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

我目前正在学习Node.JS,我无法弄清楚如何在节点中处理它。我认为没有必要对节点中的线程池进行编码思考。

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

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

2 个答案:

答案 0 :(得分:3)

Node是单线程的,因此没有用户线程池 [1] 。相反,您需要使用更多节点服务器进行水平扩展。您可以在节点应用中执行此操作: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]用户代码运行单线程(但你可以使用web worker来拥有线程)但是libuv是多线程的。阅读更多:How the single threaded non blocking IO model works in Node.js

答案 1 :(得分:2)

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

更广泛问题的答案是:

在nodejs或java中编写数据库密集型应用程序的方式没有太大区别,因为很可能您的瓶颈将是数据库后面的持久存储,而不管平台如何。但在异步架构中:

  1. 设计一个不会因负载过大而压倒数据库的系统更为自然

  2. 如果数据库速度下降,应用程序本身通常不需要更多系统资源

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