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
    1/38
    Node.js  : les streams
    Recoder CloudUp avec les streams

    View Slide

  2. Blend 2014 – Streams – Nicolas Chambrier
    2/38
    Qui suis-je ?

    Développeur

    Formateur

    Entrepreneur

    Passionné

    Contact :
    – @naholyr
    [email protected]

    View Slide

  3. 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)

    View Slide

  4. 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

    View Slide

  5. Blend 2014 – Streams – Nicolas Chambrier
    5/38
    C'est quoi les streams ?

    Des données d'un côté
    – Stockées, générées…
    C'est un seau

    View Slide

  6. 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

    View Slide

  7. 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…)

    View Slide

  8. Blend 2014 – Streams – Nicolas Chambrier
    8/38
    C'est quoi les streams ?

    Fluide (gaz, liquide), flux électrique, flux
    d'octets (système de fichiers)…

    View Slide

  9. 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

    View Slide

  10. Blend 2014 – Streams – Nicolas Chambrier
    10/38
    Et donc Node.js ?

    Module stream

    Classes de base : Readable, …

    View Slide

  11. Blend 2014 – Streams – Nicolas Chambrier
    11/38
    Et donc Node.js ?

    Module stream

    Classes de base : Readable, …

    View Slide

  12. Blend 2014 – Streams – Nicolas Chambrier
    12/38
    Et donc Node.js ?

    Module stream

    Classes de base : Readable, Writable

    View Slide

  13. Blend 2014 – Streams – Nicolas Chambrier
    13/38
    Et donc Node.js ?

    Module stream

    Classes de base : Readable, Writable

    Brancher une readable vers une writable

    View Slide

  14. Blend 2014 – Streams – Nicolas Chambrier
    14/38
    Et donc Node.js ?

    Module stream

    Classes de base : Readable, Writable

    Brancher une readable vers une writable

    View Slide

  15. Blend 2014 – Streams – Nicolas Chambrier
    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

    View Slide

  16. 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…

    View Slide

  17. 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)…

    View Slide

  18. 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 ?

    View Slide

  19. 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)

    View Slide

  20. 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)

    View Slide

  21. 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)

    View Slide

  22. 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)

    View Slide

  23. 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() »

    View Slide

  24. 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

    View Slide

  25. Blend 2014 – Streams – Nicolas Chambrier
    25/38
    Ça déborde !

    fs.createReadStream respecte le
    highWaterMark

    View Slide

  26. 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

    View Slide

  27. 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…

    View Slide

  28. 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 ?

    View Slide

  29. 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 ?

    View Slide

  30. 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 !

    View Slide

  31. 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 ?

    View Slide

  32. 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

    View Slide

  33. 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 ?

    View Slide

  34. 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…

    View Slide

  35. 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 ?

    View Slide

  36. 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 »

    View Slide

  37. 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 »

    View Slide

  38. Blend 2014 – Streams – Nicolas Chambrier
    38/38
    Merci
    Slides
    speakerdeck.com/naholyr/blendwebmix-2014-streams-node-dot-js
    Code
    github.com/naholyr/file-share-server

    View Slide