Wat maakt Node.js specifieker schaalbaar dan Apache?

Om eerlijk te zijn heb ik het nog niet helemaal begrepen – en ik begrijp zelfs hoe Node.js werkt, als een enkele thread met behulp van het gebeurtenismodel. Ik snap gewoon niet hoe dit beter is dan Apache, en hoe het horizontaal schaalt als het single-threaded is.


Antwoord 1, autoriteit 100%

Ik heb ontdekt dat dit blogbericht van Tomislav Capan het heel goed uitlegt:
Waarom zou ik in godsnaam Node.js gebruiken? Een introductie per geval

Mijn interpretatie van de essentie ervan, voor Node 0.10, vergeleken met Apache:

De goede delen

  • Node.js vermijdt het opdraaien van threadsvoor elk verzoek, of hoeft geen pooling van verzoeken naar een set threads af te handelen zoals Apache dat doet. Daarom heeft het minder overhead om verzoeken af ​​te handelen en blinkt het uit in snel reageren.
  • Node.js kan de uitvoering van het verzoek delegerenaan een afzonderlijk onderdeel en zich richten op nieuwe verzoeken totdat het gedelegeerde onderdeel terugkeert met het verwerkte resultaat. Dit is asynchrone code en wordt mogelijk gemaakt door het eventingmodel. Apache voert verzoeken serieel uit binnen een pool en kan de thread niet opnieuw gebruiken wanneer een van zijn modules gewoon wacht tot een taak is voltooid. Apache zal dan verzoeken in de wachtrij plaatsen totdat er weer een thread in de pool beschikbaar komt.
  • Node.js praat over JavaScripten is daarom erg snel in het doorgeven en manipuleren van JSON die is opgehaald uit externe web-API-bronnen zoals MongoDB, waardoor de benodigde tijd per verzoek wordt verkort. Apache-modules, zoals PHP, hebben mogelijk meer tijd nodig, omdat ze JSON niet efficiënt kunnen ontleden en manipuleren omdat ze marshallingom de gegevens te verwerken.

De slechte delen

Opmerking:de meeste van de hieronder vermelde slechte onderdelen zullen worden verbeterd met de aankomende versie 0.12, iets om op te letten.

  • Node.js is slecht in rekenintensieve taken, omdat wanneer het iets langlopends doet, het alle andere inkomende verzoeken in de wachtrij plaatst vanwege de enkele thread. Apache heeft over het algemeen meer threads beschikbaar, en het besturingssysteem zal de CPU-tijd tussen deze threads netjes en eerlijk plannen, waardoor nieuwe threads nog steeds kunnen worden afgehandeld, zij het een beetje langzamer. Behalve wanneer alle beschikbare threads in Apache verzoeken verwerken, zal Apache ook verzoeken in de wachtrij plaatsen.
  • Node.js maakt geen volledig gebruik van multi-core CPU’s, tenzij je een Node.js-cluster maakt of onderliggende processen op gang brengt. Ironisch genoeg, als je de laatste twee doet, kun je meer orkestratie-overhead toevoegen, hetzelfde probleem dat Apache heeft. Logischerwijs zou je ook meer Node.js-processen kunnen opstarten, maar dit wordt niet beheerd door Node.js. Je zou je code moeten testen om te zien wat beter werkt; 1) multi-threading vanuit Node.js met clusters en onderliggende processen, of 2) meerdere Node.js-processen.

Beperkende maatregelen

Alle serverplatforms hebben een bovengrens. Node.js en Apache zullen het beide op een gegeven moment bereiken.

  • Node.js bereikt dit het snelst als je zware rekentaken hebt.
  • Apache zal het het snelst bereiken als je er massa’s kleine verzoeken op gooit die lange seriële uitvoering vereisen.

Drie dingen die u zou kunnen doen om de doorvoer van Node.js te schalen

  1. Gebruik multi-core CPU’s, door ofwel een clusterin te stellen, gebruik onderliggende processen, of gebruik een multi-process orchestrator zoals Phusion-passagier.
  2. Setup Worker Roles verbonden met een berichtwachtrij . Dit is de meest effectieve oplossing tegen computationele intensieve langlopende aanvragen; Off-load ze naar een werknemersboerderij. Dit splitst uw servers in twee delen; 1) Publiek gericht met administratieve servers die verzoeken van gebruikers, en 2) privé-werkersservers accepteren die lange lopende taken behandelen. Beide zijn verbonden met een berichtwachtrij. De administratieve servers voegen berichten (inkomende langlopende aanvragen) toe aan de wachtrij. De arbeidersrollen luisteren naar inkomende berichten, omgaan met die, en kunnen het resultaat retourneren in de berichtwachtrij. Als aanvraag / reactie nodig is, kan de administratieve server asynchroon wachten op het antwoordbericht om in de berichtenwachtrij te komen. Voorbeelden van berichtwachtrijen zijn Rabbitmq en ZEROMQ .
  3. Set een load balancer en spin up meer servers. Nu u efficiënt gebruik van hardware gebruikt en langdurige taken afgevoert, kunt u horizontaal schalen. Als u een load-balancer heeft, kunt u meer administratieve servers toevoegen. Met behulp van een berichtwachtrij kunt u meer werknemersservers toevoegen. Je zou dit zelfs in de cloud kunnen zetten, zodat je op verzoek kunt schalen.

Antwoord 2, Autoriteit 40%

Het hangt af van hoe u het gebruikt. Node.js is standaard een van schroefdraad voorzien, maar met behulp van de (relatief) nieuwe clustermodule kunt u horizontaal over meerdere draden schalen.

Bovendien zullen uw database-behoeften ook dicteren hoe effectief schalen is met knooppunt. Bijvoorbeeld, het gebruik van MySQL met Node.Js zal je niet bijna net zo veel voordeel krijgen als MongoDB, vanwege de gebeurtenisgestuurde aard van zowel MongoDB en Node.js.

De volgende link heeft veel leuke benchmarks van systemen met verschillende setups:
http://www.techempemower.com/benchmarks/

Node.js rangschikt niet het hoogste, maar vergeleken met andere opstellingen met NGINX (geen apache op hun tafels, maar dichtbij genoeg) het doet het redelijk goed.

Nogmaals, het is sterk afhankelijk van uw behoeften. Ik geloof als u eenvoudigweg statische websites serveert, het wordt aanbevolen aan een meer traditionele stapel. Mensen hebben echter een aantal verbazingwekkende dingen gedaan met Node.Js voor andere behoeften: http://blog.caustik.com/2012/08/19/NODE-JS-W1M-constrent-connections/ (C10K? HA!)

EDIT: het is de moeite waard om te vermelden dat je echt niet ‘vervangt’, gewoon apache met node.js. U zou Apache en PHP (in een typische lampstapel) vervangen.

Other episodes