Blend 2014 – Streams – Nicolas Chambrier 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 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 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 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 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 13/38 Et donc Node.js ? ● Module stream ● Classes de base : Readable, Writable ● Brancher une readable vers une writable
Blend 2014 – Streams – Nicolas Chambrier 14/38 Et donc Node.js ? ● Module stream ● Classes de base : Readable, Writable ● Brancher une readable vers une writable
Blend 2014 – Streams – Nicolas Chambrier 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 »