node.js: zápisky z fronty (battle guide to node.js)

42
zápisky z fronty Lukáš @almadcz Linhart Ahoj, já jsem Almad

Upload: almadcz

Post on 12-May-2015

415 views

Category:

Technology


9 download

DESCRIPTION

[czech] V Apiary používáme node.js v produkci už přes rok. Proč se zamyslet nad tím, zda ho chcete? A na co se připravit a na co si dát pozor, pokud se do toho pustíte?

TRANSCRIPT

Page 1: node.js: zápisky z fronty (Battle guide to node.js)

zápisky  z  frontyLukáš  @almadcz  Linhart

Ahoj, já jsem Almad

Page 2: node.js: zápisky z fronty (Battle guide to node.js)

Historie  webu

(stručná  a  nepřesná)

Proč mě poslouchat a zabývat se node.js je dobrá otázka, takže nejprve historické okénko

Page 3: node.js: zápisky z fronty (Battle guide to node.js)

Web  ’95

Vznik webu: stránky jsou statické, jen nahrajeme HTML přes FTP. Easy-peasy, super.

Kdo umí vyslovit HTML bez zakoktání, bere velké peníze.

Page 4: node.js: zápisky z fronty (Battle guide to node.js)

Web  27.8.2001Dynamické “části”, menu, uživatelská jména a informace o posledním přihlášení, datum -- tedy šablony. Prorazil šablonovací jazyk PHP nad SSI a CGI, v jednoduchosti a graduální učící křivce je síla.

Statická část se bouří, argumentuje rychlostí a mladostí “nových” a chce psát moduly v C, případně řešit vše pomocí vkládání přes SSI (server-side includes).

Kdo umí vyslovit “CMS” nebo “SEO” bez zakoktání a nainstalovat Wordpress, bere velké peníze.

Page 5: node.js: zápisky z fronty (Battle guide to node.js)

Web  ’05CMS (content management systém, “redakční systémy”) a jejich následovníci. (Jedna) centrální databáze, MVC framework, Rails, Django.

PHPkisti se bouří, argumentují pomalostí a neozkoušeností a Davídek Nettuje.

Page 6: node.js: zápisky z fronty (Battle guide to node.js)

Web  ’12        

Více datových zdrojů, relační, grafové, dokumentové databáze, 3rd party APIs (více v dalších slidech)

JavaScriptaři vymýšlí node.js. Djangisti argumentují neefektivitou, postačující rychlostí a novostí bez knihoven.

Kdo umí vyslovit “UX” bez zakoktání a nakreslit čtvereček, bere velké peníze.

Page 7: node.js: zápisky z fronty (Battle guide to node.js)

Server  push  je  standard

Page 8: node.js: zápisky z fronty (Battle guide to node.js)

Chtěl  jsi  se  odhlásit?

Page 9: node.js: zápisky z fronty (Battle guide to node.js)

Více  datových  zdrojů

Analytická data v hadoopu, cache v memcached, grafová data v neo4j jste-li bohatí, mnohé druhy dat v redisu, dokumentová data v mongu/couchi.

Page 10: node.js: zápisky z fronty (Battle guide to node.js)

Y  U  NO  ORM  object?nerelacni databaze se mnohdy nemapuji dobre na objekty

Page 11: node.js: zápisky z fronty (Battle guide to node.js)

Data  z  jiných  služebČasté používání API jiných služeb.

Page 12: node.js: zápisky z fronty (Battle guide to node.js)

haters  gonna  hatenode.js je jen jedna z variant. Kazdopadne, Djangisti a Rubysti argumentuji novosti, absenci zakladni knihovny, pomalosti, neozkousenosti...

Page 13: node.js: zápisky z fronty (Battle guide to node.js)
Page 14: node.js: zápisky z fronty (Battle guide to node.js)

SmyčkaEvent loop. Jeden ze způsobů řešení parelelních přístupů, “obchází” cenu za kontext switch.

Něco jako cooperative multitasking ve Windows 3.11.

Page 15: node.js: zápisky z fronty (Battle guide to node.js)

V8

Jedna z nejlepších language-specific VM, brutálně rychlá. Mozkový výkon by se dal utratit líp, ale co se dá dělat.

Byť se tak místy snaží tvářit, pořád to samozřejmě není full-fledged platforma, které jsou rozumné jenom dvě (JVM a .NET CLI).

Page 16: node.js: zápisky z fronty (Battle guide to node.js)

JavaScriptStarý, ale lepší jazyk, než si myslíte. Má své chyby, ale jsou všeobecně známé. Nový assembler webu.

Page 17: node.js: zápisky z fronty (Battle guide to node.js)

...všude...

Děsivá představa pro mnohé, ale kupodivu tím ten jazyk dostává lepší rozměr: šetří se kongitivní kontext-switche z hranic mezi systémy.

Page 18: node.js: zápisky z fronty (Battle guide to node.js)

     Kafe  pomáhá

CoffeeScript opravuje spoustu problematických míst JS, doporučuju.Částečně ovšem ruší tu výhodu z předchozího slajdu, takže je dobré jím nahrazovat konzistentně.

Page 19: node.js: zápisky z fronty (Battle guide to node.js)

Neblokující  I/ONeblokující != rychlejší. Je tu ovšem lepší odolnost proti problémům se sítí etc., kdy requesty “umřou”, ale původní vlákno typicky stejně blokuje až do timeoutu.

Page 20: node.js: zápisky z fronty (Battle guide to node.js)

Existující  komunitaJS umí spousta lidí, co měli tu smůlu, že pracovali na frontendu. Znamená to, že velmi rychle vznikají knihovny na všechno a ”platforma” se posouvá dopředu překvapivě rychle.

Page 21: node.js: zápisky z fronty (Battle guide to node.js)

StreamováníVýchozí přístup je, že se nebufferuje. Jak přichází data do systému (po chuncích po buffer flushích), tak se zpracovávají. Člověk díky tomu designuje systémy na tohle zpracování tak nějak defaultně, což je většínou v kontrastu s přístupem jinde. S pamětí to dělá dobré věci.

Page 22: node.js: zápisky z fronty (Battle guide to node.js)

JavaScript meetup 29.11.

Felix Geisendörfer (node.js core commiter)

Writing high performance binary parser in node.js

http://praguejs.cz/

...a hlasujte pro kvadrukoptéru, bude určitě levnější a zábavnější!!!11!!11!

Page 23: node.js: zápisky z fronty (Battle guide to node.js)

EstetikaCoffeeScript: Když si člověk dá práci se zarovnáním šipek a rovnítek (editory pomáhají), kód se velmi dobře čte. Vzhledem k tomu, že pokud to výkonnost dovoluje, je čitelnost snad nejdůležitější atributu kódu...

Page 24: node.js: zápisky z fronty (Battle guide to node.js)

tail  -­‐f  /var/log/messages  |  coffee  logserver.coffee

Čteme input a posíláme ho v realtime do browseru. Super flexibilní v unix ekosystému...zdarma prakticky na čtyři řádky.Plný funkční kód s HTML bordelem je na https://gist.github.com/3756594

Page 25: node.js: zápisky z fronty (Battle guide to node.js)

ProblémyA nyní, konečně sada varování.

Page 26: node.js: zápisky z fronty (Battle guide to node.js)

CPU

Na rozdíl od I/O, CPU je blokující. Cokoliv co se zasekne na procesoru (jako třeba regexp catastrophic backtracking) “zabije” celý server.

Page 27: node.js: zápisky z fronty (Battle guide to node.js)

Funkce

getData  =  -­‐>  “mock  data”

Mějmě jednoduchou funkci, která vrací nějaká data -- ještě budeme řešit jaká, takže si vrátíme něco co zatím stačí.

Page 28: node.js: zápisky z fronty (Battle guide to node.js)

Změna  zdroje  dat

getData  =  (cb)  -­‐>        Model.findOne()  (m)  -­‐>                cb  m.data

...pak se k tomu vrátíme a data od někud skutečně vezmeme, třeba z databáze a vrátíme je onomu callbacku...

Page 29: node.js: zápisky z fronty (Battle guide to node.js)

...který tam původně nebyl -> změna signatury funkce a flow všeho co ji používá.Rule of thumb: pokud by se vaše funkce mohla dotknout libovolného I/O, rovnou si předávejte callback.

Page 30: node.js: zápisky z fronty (Battle guide to node.js)

Chybějící  callbackE.T. volat domu: stává se, že chyba v aplikaci se projeví tak, že člověk zapomene zavolat finální callback/render do browseru, tj. žádný traceback, nic. Debugging toho je občas mírně frustrující.

Page 31: node.js: zápisky z fronty (Battle guide to node.js)

PřestíněníCoffeeScript: scoping je dementní.

Page 32: node.js: zápisky z fronty (Battle guide to node.js)

newFunction  =  -­‐>  log  =  'abc'

   newFunction  =  function()  {        var  log;        return  log  =  'abc';    };

Pakliže funkce ve vyšším scope neexistuje, správně se vytvoří s var, tj. jenom pro podřízený scope --- výborně, opravuje to jednu z poměrně frustrujících věcí v JS (člověk omylem plevelí globální scope).

Page 33: node.js: zápisky z fronty (Battle guide to node.js)

log  =  require  './log'newFunction  =  -­‐>  log  =  'abc'

   log  =  require('./log');

   newFunction  =  function()  {        return  log  =  'abc';    };

...nicméně pokud už tam stejná proměnna existuje (samozřejmě nezávisle na tom, jakého typu), je místo toho přepsána. To znamená, že funkce nejsou zcela zapouzdřené -- jsou ovlivňovány kontextem ze svého nadřazeného scope. IMO nedobrá volba.

Page 34: node.js: zápisky z fronty (Battle guide to node.js)

API  je  pro  konzervyTrochu souvisí s předchozími poznámkami. Komunita je mladá a kreativní a dynamická a změn zpětné kompatibility se nebojí, s čímž je potřeba počítat. Node samotné už nicméně dosti stabilní je na změny API dává pozor, ekosystém k tomu ještě musí dojít.

Page 35: node.js: zápisky z fronty (Battle guide to node.js)

Výjimky  zabíjíNeodchycená výjimka zabije celý proces/server a většinou to za vás nikdo moc neřeší: standardní pattern je výjimky nevyhazovat, ale vracet v callbacích jako první parametr. Stát se to ovšem z vašeho kódu může a je potřeba na to dávat pozor.

(Třeba node-raven se to snaží řešit přes raven.patchGlobal, ale funguje to tak nějak všelijak.)

Page 36: node.js: zápisky z fronty (Battle guide to node.js)

The guys that are getting paid the big bucks to deliver scalable solutions aren’t up at night feverishly rewriting their systems in Node. They’re doing what they’ve always done: measuring, testing, benchmarking, thinking hard, keeping up with the academic literature that pertains to their problems. That’s what scaling in the large necessitates.

-- Alex Payne

Škálování

Když řikám škálování tak myslim cestu ke Škálování, nikoli stránky velikostí čínského eshopu jako seznam nebo centrum.

Page 37: node.js: zápisky z fronty (Battle guide to node.js)

Concurrency  lock-­‐in

Když člověk roste ke škálování, mění se přístupové vzorce. Díky tomu se v čase mění i vhodná řešení. V node.js je člověk zamčen, nemá možnost volby -- All Hail To Mighty Evenloop. Tohle časem člověka může bolet...na druhou stranu, v momentě, kdy řeší takové problémy, tak to znamená, že je na tom dobře.

Page 38: node.js: zápisky z fronty (Battle guide to node.js)

Kam  s  ním?I/O bound věciDistribuce dat (a APIs)ProxyRealtime / server pushTam, kde se dájí sdílet data mezi serverem a klientem (tj. javascript-heavy appky nebo při sdílení klíčové komponenty, jako třeba DSL/parseru).

Page 39: node.js: zápisky z fronty (Battle guide to node.js)

The Way of Node• Node  is  a  platform.• Node  is  JavaScript.• Node  is  callbacks  &  Streams.• Node  is  not  pretending  it  is  blocking  when  it  is  not.• Node  is  not  going  to  include  that  module.• Node  is  for  building.• Node  is  a  community.• Node  is  faster.• Node  is  fun.

-­‐-­‐  Mikeal  Rogers

Převzato z http://www.mikealrogers.com/posts/the-way-of-node.html , thx & kudos!

Page 40: node.js: zápisky z fronty (Battle guide to node.js)

Až budete psát příští aplikaci, zamyslete se, jestli na daný problém více nesedí vhodnější technologie, jestli jen neohýbate ty co znáte, protože jste po kotníky zakopání v nějaké komfortní zóně.No a kdyby vám to ve vaší firmě nechteli dovolit...

Page 41: node.js: zápisky z fronty (Battle guide to node.js)

...dovolíme vám to u nás. http://apiary.io/jobs

Page 42: node.js: zápisky z fronty (Battle guide to node.js)

Thank You• http://pinkie.ponychan.net/chan/files/src/133479594662.png

• http://www.flickr.com/photos/sukanto_debnath/519690623/sizes/o/in/photostream/

• http://www.flickr.com/photos/nicholasro/4784567537/sizes/z/in/photostream/

• http://www.flickr.com/photos/7989285@N07/1794265047/sizes/z/in/photostream/

• http://www.flickr.com/photos/28157757@N05/5715697350/sizes/l/in/photostream/

• http://www.flickr.com/photos/oskay/265899784/sizes/l/in/photostream/

• http://www.flickr.com/photos/tambako/4831699383/sizes/l/in/photostream/

• http://www.flickr.com/photos/astragony/4852775794/sizes/l/in/photostream/

• http://www.flickr.com/photos/albertoalerigi/2886157131/sizes/l/in/photostream/

• http://www.flickr.com/photos/tambako/2361526167/sizes/l/in/photostream/

• http://www.flickr.com/photos/jam343/4952338/sizes/o/in/photostream/

• http://www.flickr.com/photos/stolensnapshot/3333052115/sizes/l/in/photostream/

• http://www.flickr.com/photos/seeminglee/601883302/sizes/o/in/photostream/

• http://www.flickr.com/photos/yakobusan/2995035580/sizes/o/in/photostream/

• http://www.flickr.com/photos/striatic/2191404675/sizes/z/in/photostream/

• http://www.flickr.com/photos/boltron/4461019149/

• http://www.flickr.com/photos/olibac/3462198490/sizes/o/in/photostream/

• http://www.flickr.com/photos/anieto2k/5401318057/sizes/l/in/photostream/

• http://www.flickr.com/photos/68387408@N00/2661844560/

• http://www.flickr.com/photos/raindrift/7095243379/in/set-­‐72157629492908038/

• http://www.flickr.com/photos/13589188@N00/3164471672/

• http://www.flickr.com/photos/67471595@N00/1353578358/

• http://www.flickr.com/photos/26063220@N00/3480359060/

Everything under CC commercial on flickr through compfights -- thanks you too!

(aka Credits)