2016-04-25 34 views
11

sistema assolvono consiglia di relè di blocco IO a una piscina filo di dimensioni adeguate, come in:Gioca quadro e Node.js non bloccante comportamento per database relazionali

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

Questo è il caso di accesso al database relazionale perché non ci sono driver JDBC non bloccanti disponibili (con poche eccezioni).

Attualmente sto imparando su Node.JS e non sono riuscito a capire come questo viene gestito nel nodo. Non ho visto alcuna necessità di pensare al codice sui pool di thread nel nodo.

Quindi, i driver del database relazionale utilizzati in node.js sono in grado di eseguire IO non bloccanti? Oppure questi calcoli vengono trasmessi a qualche tipo di thread di lavoro dietro le quinte?

In senso lato: qual è il modo corretto di codificare un'app node.js che è molto intensiva per DB (relazionale)?

+0

C'è un articolo su ciò che [potresti] (https: //engineering.linkedin.com/play/play-framework-async-io-senza-thread-pool-and-callback-hell) –

+0

Dai uno sguardo a questa domanda, potrebbe aiutarti a capire come funziona il nodo sotto il cofano, ma a rispondere la tua domanda, tutti i driver del db del nodo che io conosca utilizzano interfacce io non bloccanti/il ciclo di eventi asincrono di libuv ... non dovresti preoccuparti di implementarlo a livello di applicazione: http://stackoverflow.com/questions/14795145/how-the-single-threaded-non-blocking-io-model-works-in-node-js – photoionized

risposta

2

Penso che fondamentalmente hai risposto alla tua stessa domanda: in nodejs non devi codificare in termini di pool di thread o giù di lì. I pool di thread DB in Play sono inerenti all'API JDBC Java. I driver di puro nodo DB sono asincroni di progettazione. L'architettura di un driver wrapper nodejs dipende da quella di una libreria avvolta.

La risposta alla domanda più ampia è:

Non c'è molta differenza tra come si codifica DB applicazioni intensive in nodejs o Java, come la maggior parte probabilmente il vostro collo di bottiglia sarà la memorizzazione permanente dietro la DB, indipendentemente dalla piattaforma. Ma in architetture asincrone:

  1. è più naturale per la progettazione di un sistema che non sopraffare il vostro DB con troppo carico

  2. in caso di un rallentamento DB, l'applicazione stessa di solito non richiede più risorse di sistema

Un buon pilota DB vi permetterà di raggiungere i punti di cui sopra con pool di connessioni gestite, per-query timeout, per-collegamento di query-code. Sebbene alcuni di questi potrebbero anche essere una caratteristica dell'interfaccia nativa di DB.

3

Il nodo è a thread singolo quindi non ci sono pool di thread utente [1]. Invece è necessario ridimensionare orizzontalmente con più server Node. E lo puoi fare all'interno di un'app Node: https://devcenter.heroku.com/articles/node-concurrency

E su un'altra nota, ho avuto un buon successo con il driver async-JDBC-ish postgresql-async. L'ho usato con jdub-async e scalikejdbc. Qui è un blog che ho scritto su di utilizzarlo con scalikejdbc: https://www.jamesward.com/2015/04/07/reactive-postgres-with-play-framework-scalikejdbc


[1] il codice utente esegue thread singolo (ma è possibile utilizzare i lavoratori di Internet per avere discussioni), tuttavia libuv è multi-threaded. Per saperne di più: How the single threaded non blocking IO model works in Node.js

+0

Il modulo mysql per node.js può utilizzare il pool di connessioni come da https://www.npmjs.com/package/mysql # pooling-connections Forse node.js utilizza pool di thread interni per questo? – Renan

+0

Ecco un altro riferimento complementare che afferma che node.js è multi-thread (il codice, tuttavia, viene eseguito in un singolo thread): http://rickgaribay.net/archive/2012/01/28/node-is-not- single-threaded.aspx – Renan

+0

Sì, libuv ha un pool di thread in modo che l'I/O di rete possa avere simultaneità. Ma anche se si dispone di un pool di connessioni, ciò non significa che si ottiene un thread per connessione. Controlla: https://www.future-processing.pl/blog/on-problems-with-threads-in-node-js/ –