2016-04-25 63 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/ –