Vad är grejen med Node.JS?

För att förstå fördelen med Node.JS och "non-blocking IO" måste man förstå hur en dator fungerar ...

Processor (CPU)

I varje dator sitter en processor (CPU) som utför instruktioner. Processorns hastighet mäts i Hertz.
Till exempel 2GHz betyder två miljarder cykler per sekund.
Beroende på hur avancerad instruktionen är tar det olika många cykler.

Input/Output (IO)

Input/Output (IO) är när data flödar genom datorn ...
Nedan är en hypotetisk tabell över hur många cykler det tar att hämta data från olika ställen:

CPU minne (cache) L1 3 cykler
CPU minne (cache) L2 14 cykler
Minnet (RAM) 250 cykler
Hårddisken 41 000 000 cykler
Nätverket 240 000 000 cykler

Så länge data endast flödar genom processorn går det fort, men när datorn till exempel läser från en hård-disk eller skickar data över Internet går det segt.

Non-blocking IO (Event loop)

När datorn får en instruktion att till exempel läsa en fil från hårddisken väntar den tills filen är inläst innan den fortsätter med nästa instruktion. Detta är ett problem med program som har mycket IO, till exempel en webb-server.

Den traditionella lösningen är att köra flera processor-trådar samtidigt. Då växlar datorn mellan de olika processerna (så kallad "multi threading") där instruktioner från andra processer körs under tiden en process väntar.

En annan lösning är så kallad "non-blocking IO" och "Event loop". Det går ut på att när data hämtas, schemaläggs funktionen som behöver datan att köras i framtiden. Och programmet fortsätter direkt med nästa instruktion. Det stannar alltså aldrig upp för att vänta.

"non-blocking IO" gör att programmet kan hantera stor mängd trafik, till exempel besökare på en webbplats, utan att det går segt!

Fördelen med "non-blocking IO" över "processor-trådar" / "multi threading", är att det blir mycket enklare! Man slipper till exempel problem med "låsningar"; att en process ändrar en variabel samtidigt som en annan process läser in den.
Att skapa flera processor-trådar tar dessutom extra dator-resurser.

Notera att man kan skapa extra processer i Node.JS! Men det är inte ofta man behöver det, då programmet aldrig väntar.

Callbacks

För att datorn ska veta vilken funktion den ska köra härnäst, skickar man med så kallade callbacks. Det kan se ut så här:

var fs = require("fs");
fs.readFile("filen.txt", filenLäst);

function filenLäst(err, data) {
  if (err) throw err;
  console.log(data);
}

Funktionen filenLäst skickas med som argument i funktionen fs.readFile. Och kommer köras först när filen är inläst.

Moduler

Det som är mest revolutionerande med Node.JS är modul-systemet (Common JS). I stället för att importera / inkludera kod, måste man begära (require) moduler.

Modulsystemet tvingar dig att skriva modulbaserad kod, i stället för "spaghetti"-kod.
Och som grädde på tårtan kan man begära (require) moduler vart som helst i koden, i stället för i början av koden, som de flesta andra programmerings-språk.
Detta gör att alla funktioner och objekt kan frikopplas, så att de inte är beroende av varandra. Och en funktion kan utföra vad som helst, utan att vara beroende av något utanför funktionen.
Det gör att Allt blir mycket enklare ... När du kodar i Node.JS behöver du aldrig söka runt i filer för att se vart en variabel används, och ofta behöver du inte ens scrolla. Tänk dig en sladd som aldrig trasslar.

Men självklart går det att skriva komplex (intrasslad, spaghetti-kod) även i Node.JS, men det är mycket svårare. Ska man till exempel ha en global variabel måste man lägga den i ett objekt som heter "global".

Då Node.JS tvingar dig till att abstrahera funktionalitet till moduler, och det finns miljontals utvecklare som använder Node.JS, finns det även väldigt många moduler ... Nästan allt du behöver är redan gjort av någon annan, och allt du behöver göra är att begära (require) modulen i din kod.

funktion städa() {
  var städrobot = require("städrobot");
  städrobot.städa("köket", function kökStädat() {
    städrobot.städa("hallen", function hallStädat() {
      console.log("Städroboten har städat klart!");
    });
  });
  städrobot.hastighet = 5;
}

Funktionen städa begär modulen städrobot.
När städrobot är klar med köket, städar den hallen.
Och när hallen är klar, skrivs meddelandet "Städroboten har städat klart!" ut i konsolen.
Notera att allt i Node.js är "non-blocking", d.v.s programmet stannar inte upp för att vänta på att städroboten ska städa klart. Andra funktioner kan köra under tiden!


Skrivet av Johan Zetterberg, 9:e Februari 2016


Följ mig via RSS:   RSS https://zäta.com/rss.xml (ange adressen i din feed-läsare)