Cosa rende così unico Node.js? [chiuso]


48

Recentemente ci sono stati molti elogi per Node.js. Non sono uno sviluppatore che ha avuto molta esposizione alle applicazioni di rete. Dalla mia nuda comprensione di Nodes.js, il suo punto di forza è: abbiamo un solo thread che gestisce più connessioni, fornendo un'architettura basata su eventi.

Tuttavia, ad esempio in Java, posso creare solo un thread utilizzando NIO / AIO (che è API non bloccanti dalla mia comprensione nuda) e gestire più connessioni utilizzando quel thread e fornisco un'architettura basata su eventi per implementare i dati gestione della logica (non dovrebbe essere così difficile fornendo un callback ecc.)?

Dato che JVM è una VM ancora più matura di V8 (mi aspetto che funzioni anche più velocemente) e l'architettura di gestione basata su eventi sembra essere qualcosa di non difficile da creare, non sono sicuro del motivo per cui Node.js sta attirando così tanta attenzione. Mi sono perso alcuni punti importanti?


3
Mi chiedo perché sia ​​sottoposto a downgrade ... Sento che questa domanda è più una discussione di programmazione, quindi non ho inserito StackOverflow. Ho anche cercato di cercare argomenti simili ma ho trovato solo informazioni sulla forza di Nodes.js ma il mio problema è che non capisco davvero perché la "forza" sia così unica (che ancora non riesco a trovare)
Adrian Shum

6
Prova a implementare quel modello in Java. Funziona, ovviamente. Ma vedrai una cosa: sarà molto, molto dettagliato in Java: hai bisogno di tonnellate di callback, che quasi sempre significa creare nuove classi. Potrebbe sembrare un piccolo pignolo, ma in un grande programma può diventare brutto e ingombrante abbastanza rapidamente.
Joachim Sauer,

6
I callback Javascript sono altrettanto inclini a diventare ingombranti e tali spaghetti sono molto più facili da eseguire il debug e il refactoring in Java rispetto a Javascript IMO.
funkybro,

5
@AdrianShum: è un effetto slashdot, tutto ciò che non rientra nella mentalità di gruppo verrà annullato - come lodare Microsoft su /.
gbjbaanb,

3
Sono sorpreso di non vedere nessuno menzionare l'hype.
deadalnix,

Risposte:


33

Sebbene tale concetto possa effettivamente essere implementato in molte lingue (e come menzionato dodgy_coder , è stato implementato almeno in Ruby e Python), non è affatto banale come dici.

È vero, Java ha API IO non bloccanti. In questo modo è possibile eseguire operazioni di IO su disco / rete non elaborate in modo non bloccante. Tuttavia, ogni API che in qualche modo avvolge o gestisce IO deve essere implementata anche in modo non bloccante. Ogni parser XML, ogni driver di database, ogni convertitore di formato file deve essere scritto per supportare IO non bloccante. Perché se una singola libreria sta bloccando in questo modello, ciò riduce le prestazioni dei server ai valori dell'età della pietra.

Node.js ha quell'infrastruttura di libreria, perché è sempre stata progettata in questo modo: ogni libreria che si sforza di diventare popolare deve fornire un'API asincrona o non verrà utilizzata.


18
Sì. In altre parole: la forza più importante di Node.js è la debolezza più importante di ECMAScript: la libreria standard ECMAScript incredibilmente scadente. Dato che gli sviluppatori di Node.js hanno dovuto reinventare ogni singola ruota comunque, hanno avuto la possibilità di reinventarla nel modo giusto.
Jörg W Mittag,

4
Bene, per quanto ne so ECMAScript è sempre stato progettato come linguaggio incorporato, quindi non sono state necessarie API di livello OS di alcun tipo (anche l'IO della rete è stata per lo più sottratta). Quella mancanza era davvero un vantaggio per Node.js.
Joachim Sauer,

"ogni libreria che si sforza di diventare popolare deve fornire un'API asincrona o non verrà utilizzata" Penso che sia esattamente quello che sto cercando. C'è qualche risorsa da esaminare su come viene fornita l'API asincrona, ad esempio l'analisi XML e l'accesso al DB, in Node.js?
Adrian Shum,

1
@AdrianShum in generale, cerca esempi di programmazione guidati da eventi. Implementazioni specifiche sono disponibili in molte lingue. Oltre ai moduli Node.js, puoi guardare esempi contorti in Python, twistedmatrix.com/trac/wiki , esempi POE in Perl, poe.perl.org e Ruby ha EventMachine, github.com/eventmachine/eventmachine
mghicks

19

Probabilmente il motivo principale è che utilizza JavaScript per scrivere componenti lato server per cose come server Web, applicazioni Web o servizi Web. Questo unifica il tradizionale linguaggio di sviluppo front-end (lato client) JavaScript con il linguaggio lato server.

Hai ragione - il fatto che non sia bloccante, utilizzando il modello di reattore non è unico - è stato fatto prima di usare altri linguaggi e framework, come Ruby EventMachine o Python's Twisted, ad esempio.


5
pochissime tecnologie hanno caratteristiche davvero uniche, l'unicità deriva dalla loro particolare combinazione di tutte le loro caratteristiche
jk.

1
D'accordo, c'è un elenco qui di biblioteche che lo supportano in tutte le principali lingue ... Reactor Pattern su Wikipedia
dodgy_coder

10

I tre motivi principali che vorrei dare sono:

  1. IO non bloccante / IO asincrono. Questo è cancellato ovunque sul web e nei poster precedenti. Una cosa che vorrei contribuire è che la progettazione del codice per assumere esplicitamente comportamenti asincroni aiuta il motore del compilatore a massimizzare l'hardware. Sì, molti compilatori JIT e processori hyperthreading accettano codice sincrono e aiutano a parallelizzare l'esecuzione. Questo ovviamente è l'approccio migliore. Al contrario, creando esplicitamente l'applicazione per asincrono, si garantisce che il motore e l'hardware possano massimizzare i tempi di esecuzione del codice. Certo, non ho dati quantificabili per dimostrarlo, ma mi fa sentire dentro di me pensare in questo modo.

  2. Base di codice singola per client e server. Ciò presenta una serie di vantaggi: aiuta a ottimizzare i costi del datacenter, essendo in grado di spostare la logica aziendale dal server al client; aiutare a riutilizzare la logica aziendale / la convalida dei dati; ridurre la complessità delle competenze degli sviluppatori che devono esistere per supportare il prodotto (rispetto a Python e javascript).

  3. Bassa barriera all'ingresso. In molti modi Javascirpt è come Basic, Pascal e Perl di un anno. È semplicissimo iniziare a scrivere codice e non richiede molta conoscenza del dominio per iniziare. Questo aiuta anche a ridurre i costi di sviluppo, essendo in grado di attirare più sviluppatori jr e accelerare un progetto. [Ovviamente è necessario superare gli ideologi che credono che i linguaggi di programmazione debbano essere difficili per eliminare gli sviluppatori a basso funzionamento]


Non sono sicuro che consiglierei di costruire un team Node interamente con jr. Dev JS. L'architettura non è davvero qualcosa a cui dobbiamo pensare in più progetti Web / UI di livello jr e JS impiega tanto tempo per diventare davvero bravo in termini di costruzione per il lungo raggio come qualsiasi altra lingua fa anche se è possibile ottenere risultati relativamente veloce ad un livello inferiore di esperienza su progetti meno complessi di quanto non sia tipico.
Erik Reppen,

Sono d'accordo con @ErikReppen; un team di architetti interamente composto da sviluppatori minori (indipendentemente dal linguaggio) è come progettare e costruire una casa interamente usando falegnami che sono bravi a costruire sedie, tavoli e case per cani.
Wildcard il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.