Ik ben nieuw met dit soort dingen, maar de laatste tijd hoor ik veel over hoe goed Node.js is. Gezien hoeveel ik hou van het werken met jQuery en JavaScript in het algemeen, kan ik't niet helpen, maar vraag me af hoe te beslissen wanneer Node.js te gebruiken. De webapplicatie die ik in gedachten heb is zoiets als Bitly - neemt wat inhoud, archiveert het.
Uit al het huiswerk dat ik de afgelopen dagen heb gedaan, heb ik de volgende informatie verkregen. Node.js
Enkele van de bronnen die ik ben tegengekomen zijn:
Gezien het feit dat Node.js kan bijna out-of-the-box worden uitgevoerd op Amazon's EC2 instances, ik probeer te begrijpen wat voor soort problemen Node.js nodig hebben in tegenstelling tot een van de machtige koningen die er zijn, zoals PHP, Python en Ruby. Ik begrijp dat het echt afhangt van de expertise die men heeft op een taal, maar mijn vraag valt meer in de algemene categorie van: Wanneer gebruik je een bepaald framework en voor welk soort problemen is het bijzonder geschikt?
Je hebt goed werk verricht door samen te vatten wat's geweldig is aan Node.js. Mijn gevoel is dat Node.js vooral geschikt is voor toepassingen waar je'd graag een persistente verbinding van de browser terug naar de server wilt onderhouden. Met behulp van een techniek die bekend staat als "long-polling", kun je een applicatie schrijven die updates naar de gebruiker stuurt in real time. Het doen van long-polling op veel van de web's giganten, zoals Ruby on Rails of Django, zou een immense belasting op de server veroorzaken, omdat elke actieve client een server proces opeet. Deze situatie komt neer op een tarpit aanval. Wanneer je iets als Node.js gebruikt, hoeft de server geen afzonderlijke threads te onderhouden voor elke open verbinding.
Dit betekent dat je een browser-gebaseerde chat applicatie in Node.js kunt maken die bijna geen systeembronnen nodig heeft om een groot aantal cliënten te bedienen. Elke keer dat je dit soort lange-polling wilt doen, is Node.js een geweldige optie.
Het is vermeldenswaard dat Ruby en Python beide tools hebben om dit soort dingen te doen (eventmachine en twisted, respectievelijk), maar dat Node.js het uitzonderlijk goed doet, en van de grond af aan. JavaScript is uitzonderlijk goed gesitueerd voor een callback-gebaseerd concurrency model, en het blinkt hier uit. Ook de mogelijkheid om te serializeren en deserializeren met JSON die native is aan zowel de client als de server is behoorlijk handig.
Ik kijk ernaar uit om andere antwoorden te lezen, dit is een fantastische vraag.
Het is de moeite waard erop te wijzen dat Node.js ook geweldig is voor situaties waarin je veel code zult hergebruiken over de client/server kloof. Het Meteor framework maakt dit echt gemakkelijk, en veel mensen suggereren dat dit de toekomst van webontwikkeling zou kunnen zijn. Ik kan uit ervaring zeggen dat het's een heleboel plezier om code te schrijven in Meteor, en een groot deel van dit is minder tijd besteden aan het nadenken over hoe je's je gegevens gaat herstructureren, zodat de code die in de browser draait het gemakkelijk kan manipuleren en terug kan geven.
Hier's een artikel over Pyramid en long-polling, dat heel gemakkelijk op te zetten blijkt te zijn met een beetje hulp van gevent: TicTacToe en Long Polling met Pyramid.
Ik denk dat Node.js het meest geschikt is voor real-time toepassingen: online spelletjes, samenwerkingstools, chatrooms, of iets anders waarbij wat een gebruiker (of robot? of sensor?) met de toepassing doet, onmiddellijk door andere gebruikers moet worden gezien, zonder een pagina te verversen.
Ik moet ook vermelden dat Socket.IO in combinatie met Node.js je real-time latency nog verder zal reduceren dan wat mogelijk is met lange polling. Socket.IO zal terugvallen op lange polling als worst case scenario, en in plaats daarvan web sockets gebruiken of zelfs Flash als die beschikbaar zijn.
Maar ik moet ook vermelden dat zowat elke situatie waarin de code zou kunnen blokkeren door threads, beter kan worden aangepakt met Node.js. Of elke situatie waarin de applicatie event-driven moet zijn.
Ryan Dahl zei ook in een lezing die ik ooit bijwoonde dat de Node.js benchmarks dicht in de buurt komen van Nginx voor gewone oude HTTP verzoeken. Dus als we bouwen met Node.js, kunnen we onze normale bronnen vrij effectief serveren, en wanneer we het event-driven spul nodig hebben, is het klaar om het aan te kunnen.
Plus het is allemaal JavaScript de hele tijd. Lingua Franca op de hele stack.
Om het kort te houden:
Node.js is zeer geschikt voor toepassingen die veel gelijktijdige verbindingen hebben en waarbij elk verzoek maar heel weinig CPU-cycli nodig heeft, omdat de event-lus (met alle andere clients) geblokkeerd wordt tijdens de uitvoering van een functie.
Een goed artikel over de event loop in Node.js is Mixu's tech blog: Understanding the node.js event loop.