Share
Embed
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
Transcript
38 slides
-
Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 1/38
Node.js : les streams Recoder CloudUp avec les streams -
Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 2/38
Qui suis-je ? • Développeur • Formateur • Entrepreneur • Passionné • Contact : – @naholyr – [email protected] -
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) -
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 -
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 -
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 -
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…) -
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)… -
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 -
Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 10/38
Et donc Node.js ? • Module stream • Classes de base : Readable, … -
Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 11/38
Et donc Node.js ? • Module stream • Classes de base : Readable, … -
Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 12/38
Et donc Node.js ? • Module stream • Classes de base : Readable, Writable -
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 -
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 -
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 -
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… -
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)… -
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 ? -
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) -
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) -
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) -
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) -
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() » -
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 -
Blend 2014 – Streams – Nicolas Chambrier <Byte Club> 25/38
Ça déborde ! • fs.createReadStream respecte le highWaterMark -
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 -
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… -
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 ? -
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 ? -
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 ! -
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 ? -
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 -
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 ? -
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… -
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 ? -
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 » -
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 » -
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