Upgrade to Pro — share decks privately, control downloads, hide ads and more …

BlendWebMix '14 - Streams Node.js

BlendWebMix '14 - Streams Node.js

Les streams Node.js pour recoder un système à la cloudup.

* Conférence 29/10/2014
* Code des démos sur https://github.com/naholyr/file-share-server

Nicolas Chambrier

October 29, 2014
Tweet

More Decks by Nicolas Chambrier

Other Decks in Programming

Transcript

  1. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 1/38

    Node.js  : les streams Recoder CloudUp avec les streams
  2. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 2/38

    Qui suis-je ? • Développeur • Formateur • Entrepreneur • Passionné • Contact : – @naholyr – [email protected]
  3. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 3/38

    C'est quoi Node.js ? • JS côté serveur • Ce n'est pas maintenant qu'on rentrera dans les détails :) – (il faut venir au LyonJS)
  4. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 4/38

    C'est quoi CloudUp ? • Un site en Node.js – créé entre autres par T.J. Holowaychuck • Fonctionnalité principale : télécharger dès que l'upload commence • C'est aussi un super prétexte pour parler de streams
  5. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 5/38

    C'est quoi les streams ? • Des données d'un côté – Stockées, générées… C'est un seau
  6. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 6/38

    C'est quoi les streams ? • Ces données transitent – Goutte par goutte, paquet par paquet… – …sous forme de « flux » C'est un tuyau
  7. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 7/38

    C'est quoi les streams ? • On peut lire un flux (le seau) • On peut écrire vers un flux (le tuyau, un autre seau…)
  8. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 8/38

    C'est quoi les streams ? • Fluide (gaz, liquide), flux électrique, flux d'octets (système de fichiers)…
  9. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 9/38

    Et donc, les streams ? • Une autre façon de gérer un résultat asynchrone : – Asynchrone : le résultat d'une opération – Événements : un ensemble de résultats, dans un ordre imprévu – Flux : un résultat éclaté en paquets arrivant dans l'ordre
  10. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 10/38

    Et donc Node.js ? • Module stream • Classes de base : Readable, …
  11. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 11/38

    Et donc Node.js ? • Module stream • Classes de base : Readable, …
  12. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 12/38

    Et donc Node.js ? • Module stream • Classes de base : Readable, Writable
  13. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 13/38

    Et donc Node.js ? • Module stream • Classes de base : Readable, Writable • Brancher une readable vers une writable
  14. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 14/38

    Et donc Node.js ? • Module stream • Classes de base : Readable, Writable • Brancher une readable vers une writable
  15. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 15/38

    Et donc Node.js ? • Module stream • Classes de base : Readable, Writable • Implémenter ses propres streams : hériter de Readable, Writable, Duplex, Transform… enjoy ! – RTFM
  16. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 16/38

    Et donc Node.js ? • Module stream • Classes de base : Readable, Writable • Créer des streams : fs, http, net…
  17. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 17/38

    Attention à la gestion d'erreurs ! • Les streams sont des EventEmitter – Événement spécial « error » – Crash si pas écouté • « pipe » NE CATCHE PAS LES ERREURS – Écouter « error » sur TOUS les flux – Une erreur est vite arrivée (sockets)…
  18. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 18/38

    En parlant d'erreurs… • Que se passe-t-il si on bouche le tuyau ? C'est un bouchon Du coup ça va péter ?
  19. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 19/38

    Ça déborde ! • Scénarios de saturation : – Des données prête dans une readable, qui s'accumulent car personne ne lit Accumulation de données (readable)
  20. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 20/38

    Ça déborde ! • Scénarios de saturation : – Des données prête dans une readable, qui s'accumulent car personne ne lit • Buffering (Google: « Streams under the hood ») • highWaterMark Accumulation de données (readable)
  21. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 21/38

    Ça déborde ! • Scénarios de saturation : – Le writable n'est pas prêt mais on insiste pour lui balancer des données On essaie d'écrire mais on pousse sur le bouchon (writable)
  22. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 22/38

    Ça déborde ! • Scénarios de saturation : – Le writable n'est pas prêt mais on insiste pour lui balancer des données • Retour booléan de « write() » • Événement « drain » On essaie d'écrire mais on pousse sur le bouchon (writable)
  23. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 23/38

    Ça déborde ! • Ces règles sont facultatives – Les implémentations ne tiennent pas forcément compte de « highWaterMark » – L'utilisateur est libre de ne pas tenir compte du retour de « write() »
  24. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 24/38

    Ça déborde ! • Ces règles sont facultatives – Les implémentations ne tiennent pas forcément compte de « highWaterMark » – L'utilisateur est libre de ne pas tenir compte du retour de « write() » – Assumez les conséquences Et ça c'est ta RAM
  25. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 25/38

    Ça déborde ! • fs.createReadStream respecte le highWaterMark
  26. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 26/38

    OK c'est cool ! • Un « chunk » on ne peut pas en faire grand- chose – Exception : « objectMode » mais on n'a pas trop le temps là • La plupart du temps on doit attendre la fin du flux pour commencer à en faire quelque- chose – Doin it wrong
  27. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 27/38

    Ah c'est pas cool en fait ? • C'est pour traiter des flux d'information – Use-case : upload • OK mais l'upload je sais déjà gérer…
  28. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 28/38

    Ah c'est pas cool en fait ? • C'est pour traiter des flux d'information – Use-case : upload • OK mais l'upload je sais déjà gérer… • Et stocker le fichier à deux endroits en même temps, à mesure qu'il s'uploade, tu sais faire ?
  29. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 29/38

    Ah c'est pas cool en fait ? • C'est pour traiter des flux d'information – Use-case : upload • OK mais l'upload je sais déjà gérer… • Et lancer un download au fur et à mesure que ça upload ?
  30. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 30/38

    Ah c'est pas cool en fait ? • C'est pour traiter des flux d'information – Use-case : upload • OK mais l'upload je sais déjà gérer… • Et lancer un download au fur et à mesure que ça upload ? • Il y en a qui montent des startups avec ça !
  31. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 31/38

    Implémentation • Implémentation naïve : – Garder la request de l'utilisateur 1 en mémoire – « pipe » vers la response de l'utilisateur 2 • Problèmes : – Plusieurs uploads ?
  32. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 32/38

    Implémentation • Implémentation naïve : – Garder la request de l'utilisateur 1 en mémoire – « pipe » vers la response de l'utilisateur 2 • Problèmes : – Plusieurs uploads ? • Un hashmap des requests en mémoire
  33. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 33/38

    Implémentation • Implémentation naïve : – Garder la request de l'utilisateur 1 en mémoire – « pipe » vers la response de l'utilisateur 2 • Problèmes : – Plusieurs uploads ? – Plusieurs downloads d'un même upload ?
  34. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 34/38

    Implémentation • Implémentation naïve : – Garder la request de l'utilisateur 1 en mémoire – « pipe » vers la response de l'utilisateur 2 • Problèmes : – Plusieurs uploads ? – Plusieurs downloads d'un même upload ? • Ce qui est déjà téléchargé a été lu depuis la request,et ne peut être re-lu • Stocker ce qui a déjà été lu, faire un système de reprise…
  35. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 35/38

    Implémentation • Implémentation naïve : – Garder la request de l'utilisateur 1 en mémoire – « pipe » vers la response de l'utilisateur 2 • Problèmes : – Plusieurs uploads ? – Plusieurs downloads d'un même upload ? – L'occupation mémoire ?
  36. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 36/38

    Implémentation • Implémentation naïve : – Garder la request de l'utilisateur 1 en mémoire – « pipe » vers la response de l'utilisateur 2 • Implémentation un peu plus maline : – Module « pending-streams »
  37. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 37/38

    Implémentation • Implémentation naïve : – Garder la request de l'utilisateur 1 en mémoire – « pipe » vers la response de l'utilisateur 2 • Implémentation un peu plus maline : – Module « pending-streams »
  38. Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 38/38

    Merci Slides speakerdeck.com/naholyr/blendwebmix-2014-streams-node-dot-js Code github.com/naholyr/file-share-server