【问题标题】:Play Framework and Node.js non-blocking behaviour for relational databasesPlay Framework 和 Node.js 关系数据库的非阻塞行为
【发布时间】:2016-08-18 05:43:50
【问题描述】:

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

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

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

我目前正在学习 Node.JS,但我无法弄清楚它是如何在 node.js 中处理的。我没有看到任何需要考虑节点中的线程池的代码。

那么,node.js 中使用的关系数据库驱动程序是否能够进行非阻塞 IO?还是这些计算被转发到幕后的某种工作线程?

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

【问题讨论】:

  • 有一篇关于你might enjoy的文章
  • 看看这个问题,它可能有助于澄清你对节点如何在后台工作的理解,但要回答你的问题,我知道的所有节点数据库驱动程序都使用非阻塞 io 接口/libuv 异步事件循环...您不必担心在应用程序级别实现它:stackoverflow.com/questions/14795145/…

标签: node.js performance playframework threadpool


【解决方案1】:

节点是单线程的,因此没有用户线程池[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

【讨论】:

【解决方案2】:

我认为您基本上回答了您自己的问题:在 nodejs 中,您不必根据线程池进行编码。 Play 中的 DB 线程池是 Java JDBC API 所固有的。纯 nodejs 数据库驱动程序在设计上是异步的。 nodejs 封装驱动的架构依赖于封装库的架构。

更广泛的问题的答案是:

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

  1. 设计一个不会让您的数据库因过多负载而不堪重负的系统更为自然

  2. 在 DB 减速的情况下,应用程序本身通常不会需要更多的系统资源

一个好的数据库驱动程序可以让您通过托管连接池、每个查询超时、每个连接查询队列来实现上述几点。虽然其中一些也可能是本机 DB 接口的一个特性。

【讨论】:

    猜你喜欢
    • 2017-09-10
    • 2012-05-11
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 2013-01-26
    • 2019-04-14
    • 2016-07-06
    • 2012-03-10
    相关资源
    最近更新 更多