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

Atelier RxJava, les mains dans le code (DevoxxFr2015)

Atelier RxJava, les mains dans le code (DevoxxFr2015)

Slides pour l'atelier de découverte de RxJava par la pratique, une migration d'application legacy. Le squelette du code est disponible sur http://bit.ly/PracticalRx

Simon Baslé

April 08, 2015
Tweet

More Decks by Simon Baslé

Other Decks in Programming

Transcript

  1. @simonbasle
    #PracticalRxJava
    RxJava, les mains dans le
    code
    @simonbasle & @ldoguin
    Couchbase

    View Slide

  2. @simonbasle
    #PracticalRxJava
    Le Plan (sans accroc)
    •Présentation de RxJava
    •L'application legacy
    •8 étapes de migration
    • opérateurs utiles
    • instructions et pièges à éviter
    ● Q&A

    View Slide

  3. Objectifs
    Appliquer les principaux
    opérateurs
    Mise en pratique de RxJava
    Migrer une
    application "legacy"

    View Slide

  4. RxJava

    View Slide

  5. RxJava

    View Slide

  6. @simonbasle
    #PracticalRxJava
    Pourquoi?
    • Cas d’utilisations: Asynchrone, Event Based, IO, Temps
    de traitement, Concurrence
    -> n'importe quelle opération qui peut Bloquer
    • Bloquer c’est Mal, voyez?
    • Toi aussi deviens asynchrone, composable, lisible.

    View Slide

  7. @simonbasle
    #PracticalRxJava
    Vous avez déjà essayé?
    •Etre Async c’est pas si simple
    • Java Future
    • Callback
    • Entre la gestion d’erreur, d’exceptions, annulations,
    synchro, threading
    • Et on n’a pas encore abordé la lisibilité du code….

    View Slide

  8. @simonbasle
    #PracticalRxJava
    Origines

    View Slide

  9. @simonbasle
    #PracticalRxJava
    Principes
    Iterable - Iterator | Pull
    V.S.
    Observable - Observer | Push
    La donnée deviens un flux, poussé vers le consommateur.

    View Slide

  10. @simonbasle
    #PracticalRxJava
    Simplicité et Composabilité
    •Observable = flux connectable à un Observer
    • Un Observer a 3 actions: onNext, onError, onCompleted
    • Le flux est composable et permet d’être plus descriptif
    dans ce que l’on veux faire
    • transformer
    • filtrer
    • combiner
    • gérer les erreurs de manière avancée
    • intégrer la notion de temporalité

    View Slide

  11. L'application

    View Slide

  12. Wow
    pool API?
    Much Legacy!

    View Slide

  13. @simonbasle
    #PracticalRxJava
    Doge Mining Pool UI
    Rest Controller Rest Controller Rest Controller Rest Controller
    Service Service Service
    External API External API External API
    DB
    L
    E
    G
    A
    C
    Y

    View Slide

  14. @YourTwitterHandle
    #DVXFR14{session hashtag} @simonbasle
    #PracticalRxJava
    1. Création Simple

    View Slide

  15. @simonbasle
    #PracticalRxJava
    Services à Migrer
    •AdminService
    •CoinService
    •HashrateService
    •PoolService*

    View Slide

  16. @simonbasle
    #PracticalRxJava
    Opérateurs Utiles
    •Observable.from
    •Observable.just
    •Observable.create
    •map

    View Slide

  17. @simonbasle
    #PracticalRxJava
    Opérateurs Utiles
    •Observable.from
    •Observable.just
    •Observable.create
    •map

    View Slide

  18. @YourTwitterHandle
    #DVXFR14{session hashtag} @simonbasle
    #PracticalRxJava
    Comment Adapter les Controllers?

    View Slide

  19. @simonbasle
    #PracticalRxJava
    Naïvement
    •Bloquer sur un Observable
    •take(n)
    vs.
    •single(), first()
    •xxxOrDefault(T), toList()

    View Slide

  20. @simonbasle
    #PracticalRxJava
    Attention
    •Certains usages des services continuent de compiler
    • bien vérifier non seulement les erreurs de compilation
    mais aussi les usages de chaque méthode...

    View Slide

  21. @simonbasle
    #PracticalRxJava
    Take

    View Slide

  22. @simonbasle
    #PracticalRxJava
    Single

    View Slide

  23. @simonbasle
    #PracticalRxJava
    SingleOrDefault

    View Slide

  24. @YourTwitterHandle
    #DVXFR14{session hashtag} @simonbasle
    #PracticalRxJava
    2. Transformer

    View Slide

  25. @simonbasle
    #PracticalRxJava
    Services à Migrer
    •PoolService
    • poolGigaHashrate()

    View Slide

  26. @simonbasle
    #PracticalRxJava
    Opérateurs Utiles
    •flatMap
    •reduce

    View Slide

  27. @simonbasle
    #PracticalRxJava
    FlatMap

    View Slide

  28. @simonbasle
    #PracticalRxJava
    Reduce

    View Slide

  29. @YourTwitterHandle
    #DVXFR14{session hashtag} @simonbasle
    #PracticalRxJava
    3. Filtrer

    View Slide

  30. @simonbasle
    #PracticalRxJava
    Services à Migrer
    •UserService
    • findAll sera pour l'instant adapté naïvement (Observable.from(...))
    • composer sur findAll pour findById / findByLogin
    •SearchService

    View Slide

  31. @simonbasle
    #PracticalRxJava
    Opérateurs Utiles
    •filter
    •take
    •flatMap
    • pour récupérer en asynchrone des données supplémentaires pour le filtre

    View Slide

  32. @simonbasle
    #PracticalRxJava
    Filter

    View Slide

  33. @YourTwitterHandle
    #DVXFR14{session hashtag} @simonbasle
    #PracticalRxJava
    4. Compter

    View Slide

  34. @simonbasle
    #PracticalRxJava
    Services à Migrer
    •RankingService
    • from pour rankByHashrate / RankByCoins
    • migration complète pour les autres méthodes

    View Slide

  35. @simonbasle
    #PracticalRxJava
    Opérateurs Utiles
    •takeUntil
    •count
    •take

    View Slide

  36. @simonbasle
    #PracticalRxJava
    TakeUntil

    View Slide

  37. @simonbasle
    #PracticalRxJava
    Count

    View Slide

  38. @YourTwitterHandle
    @YourTwitterHandle
    @simonbasle
    #PracticalRxJava
    Time for a Break :)

    View Slide

  39. @YourTwitterHandle
    #DVXFR14{session hashtag} @simonbasle
    #PracticalRxJava
    5. Effets de Bord

    View Slide

  40. @simonbasle
    #PracticalRxJava
    doOnXXX
    •doOnNext
    •doOnError
    •doOnCompleted
    •doOnEach

    View Slide

  41. @simonbasle
    #PracticalRxJava
    PoolService
    •ajouter une ligne de log à chaque fois qu'un utilisateur se
    connecte

    View Slide

  42. @YourTwitterHandle
    #DVXFR14{session hashtag} @simonbasle
    #PracticalRxJava
    6. Combiner

    View Slide

  43. @simonbasle
    #PracticalRxJava
    Niveau Sayen
    •concat

    View Slide

  44. @simonbasle
    #PracticalRxJava
    Niveau Sayen
    •merge

    View Slide

  45. @simonbasle
    #PracticalRxJava
    Niveau Super-Sayen
    •zip

    View Slide

  46. @YourTwitterHandle
    #DVXFR14{session hashtag} @simonbasle
    #PracticalRxJava
    Soyez un Super Sayan

    View Slide

  47. @simonbasle
    #PracticalRxJava
    StatService.getAllStats
    •pour chaque utilisateur
    • récupérer son hashrate
    • récupérer son nombre de pièces
    • combiner les deux pour créer un UserStat

    View Slide

  48. @YourTwitterHandle
    #DVXFR14{session hashtag} @simonbasle
    #PracticalRxJava
    On Arrête de Jouer

    View Slide

  49. @YourTwitterHandle
    #DVXFR14{session hashtag} @simonbasle
    #PracticalRxJava
    007. Live & Let Die (& Retry)

    View Slide

  50. @simonbasle
    #PracticalRxJava
    Problème?
    •StatService.lastBlockFoundBy
    • implem à toute épreuve (choisir un utilisateur au hasard)
    • oui mais si on voulait le tenter sans connaître le nombre
    d'utilisateurs à l'avance?

    View Slide

  51. @simonbasle
    #PracticalRxJava
    Le Plan
    •Générer un index au hasard (dans une limite à la louche)
    •Réssayer jusqu'à 4 fois si c'est trop grand
    •En dernier recours retourner un User créé pour l'occasion
    (utilisateur banni?)

    View Slide

  52. @simonbasle
    #PracticalRxJava
    Opérateurs Utiles
    •flatMap
    •skip
    •retry
    •onErrorReturn

    View Slide

  53. @simonbasle
    #PracticalRxJava
    Retry

    View Slide

  54. @simonbasle
    #PracticalRxJava
    OnErrorReturn

    View Slide

  55. Piège
    n°1

    View Slide

  56. skip ne génère pas d'erreur si on dépasse
    Piège
    n°1

    View Slide

  57. skip ne génère pas d'erreur si on dépasse
    combiner un first/last
    Piège
    n°1

    View Slide

  58. Piège
    n°2

    View Slide

  59. just met en cache la valeur
    Piège
    n°2

    View Slide

  60. just met en cache la valeur
    utiliser create pour régénérer
    à chaque essai
    Piège
    n°2

    View Slide

  61. @YourTwitterHandle
    #DVXFR14{session hashtag} @simonbasle
    #PracticalRxJava
    8. Améliorer les Controllers

    View Slide

  62. @simonbasle
    #PracticalRxJava
    Réponse Asynchrone
    •Retourner du DeferredResult
    •Subscribe sur les flux
    • onNext: injecter le résultat via setResult
    • onError: créer une DogePoolException et l’injecter via
    setErrorResult
    •retourner le DeferredResult immédiatement

    View Slide

  63. @simonbasle
    #PracticalRxJava
    Controleurs à Améliorer
    •AdminController (simple)
    •IndexController (plus compliqué)
    • user du zip, flatMap, single pour détecter les mauvais
    utilisateurs...
    •UserProfileController (plus compliqué)

    View Slide

  64. @YourTwitterHandle
    #DVXFR14{session hashtag} @simonbasle
    #PracticalRxJava
    9. Enchaîner les Appels

    View Slide

  65. @simonbasle
    #PracticalRxJava
    ExchangeRateService
    •Appelle deux API externes
    • Taux de change du Doge vers Dollar
    • Taux de change Monnaie A vers Monnaie B
    •La combinaison des deux permet d'obtenir le Doge vers
    Monnaie B
    •Appels REST

    View Slide

  66. @simonbasle
    #PracticalRxJava
    Opérateurs Utiles
    •Observable.create
    • pour wrapper l'appel
    • capturer les RestClientException et en faire des
    DogePoolException, notamment pour les timeouts
    •zipWith (idem zip)

    View Slide

  67. Oh
    Hey!
    ! WARNING - Incoming Product Owner !

    View Slide

  68. "cette API gratuite de taux de change
    plante trop souvent,
    fait en sorte de basculer vers une API
    alternative payante quand c'est le cas"
    - le Product Owner

    View Slide

  69. "cette API gratuite de taux de change
    plante trop souvent,
    fait en sorte de basculer vers une API
    alternative payante quand c'est le cas"
    - le Product Owner

    View Slide

  70. "ah oui et si tu pouvais
    comptabiliser les coûts
    de ces appels ça serait
    top"
    - le Product Owner, se versant un café
    Much Surprise
    Such Requirements
    wow

    View Slide

  71. @simonbasle
    #PracticalRxJava
    Le Plan
    •Ajouter de quoi enregistrer un coût dans AdminService
    •Ajouter une méthode à ExchangeRateService
    • utiliser la propriété exchange.nonfree.api.baseUrl
    •Basculer grâce à OnErrorResumeNext
    •Utiliser les effets de bord
    • logger les appels basculés, enregistrer l'impact en coût

    View Slide

  72. @simonbasle
    #PracticalRxJava
    OnErrorResumeNext

    View Slide

  73. @YourTwitterHandle
    @YourTwitterHandle
    @simonbasle
    #PracticalRxJava
    Q & A

    View Slide

  74. @simonbasle
    #PracticalRxJava
    SideCar Motocross
    CC-BY-ND Jean-Daniel Echenard on Flickr
    https://www.flickr.com/photos/34804353@N02/6981852262/
    Fusion Panda
    CC-BY-NC Domonated on DeviantArt
    http://domonated.deviantart.com/art/dragon-ball-z-fusion-298515441
    Sandpit
    CC0
    http://en.wikipedia.org/wiki/Sandpit#/media/File:Sandpit.jpg
    DBZ Cosplayer at DaishoCon
    CC-BY ygktech on Flickr
    https://www.flickr.com/photos/ygktech/15905787661/
    Tumbeast Gnawing on Servers
    CC-BY Matthew Inman
    http://en.wikipedia.org/wiki/Error_message#/media/File:Tumbeasts_servers.png
    Kane Cleaning Supplies
    CC-BY collinanderson on Flickr
    https://www.flickr.com/photos/collinanderson/2912308728
    Chain
    CC0
    http://commons.wikimedia.org/wiki/File:Chain_1.JPG
    Marble Diagrams (all)
    CC-BY ReactiveX Documentation
    http://reactivex.io/
    Office Space still
    Copyright 20th Century Fox
    Broken Keyboard
    CC-BY Santeri Viinamäki on Wikimedia
    http://upload.wikimedia.org/wikipedia/commons/0/02/Broken_keyboard.jpg
    Black Hole with Corona
    CC0 Public Domain - NASA
    http://upload.wikimedia.org/wikipedia/commons/8/89/PIA16695-BlackHole-
    Corona-20130227.jpg
    Gobots Toys
    CC-BY Tom Prankerd on Wikimedia
    http://upload.wikimedia.org/wikipedia/en/f/f6/GobotToys.jpg
    Woman Smoking Cigar in Cuba
    CC-BY Tibor Végh on Wikimedia
    http://commons.wikimedia.org/wiki/File:Cigar_smoking_woman_in_Cuba.jpg
    Coffee Filter
    CC0 Public Domain
    http://pixabay.com/fr/caf%C3%A9-filtre-caf%C3%A9ine-boire-690965/
    Abacus
    CC0 Public Domain
    http://pixabay.com/fr/abaque-comptent-les-math%C3%A9matiques-485704/
    Trap
    CC-BY-SA anticiv on Flickr
    https://www.flickr.com/photos/anticiv/294895884/
    Crédits

    View Slide