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

Fda20bf9d9c85c4390ca7237beba45a2?s=128

Simon Baslé

April 08, 2015
Tweet

Transcript

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

    @ldoguin Couchbase
  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
  3. Objectifs Appliquer les principaux opérateurs Mise en pratique de RxJava

    Migrer une application "legacy"
  4. RxJava

  5. RxJava

  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.
  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….
  8. @simonbasle #PracticalRxJava Origines

  9. @simonbasle #PracticalRxJava Principes Iterable - Iterator | Pull V.S. Observable

    - Observer | Push La donnée deviens un flux, poussé vers le consommateur.
  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é
  11. L'application

  12. Wow pool API? Much Legacy!

  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
  14. @YourTwitterHandle #DVXFR14{session hashtag} @simonbasle #PracticalRxJava 1. Création Simple

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

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

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

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

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

    first() •xxxOrDefault(T), toList()
  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...
  21. @simonbasle #PracticalRxJava Take

  22. @simonbasle #PracticalRxJava Single

  23. @simonbasle #PracticalRxJava SingleOrDefault

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

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

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

  27. @simonbasle #PracticalRxJava FlatMap

  28. @simonbasle #PracticalRxJava Reduce

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

  30. @simonbasle #PracticalRxJava Services à Migrer •UserService • findAll sera pour

    l'instant adapté naïvement (Observable.from(...)) • composer sur findAll pour findById / findByLogin •SearchService
  31. @simonbasle #PracticalRxJava Opérateurs Utiles •filter •take •flatMap • pour récupérer

    en asynchrone des données supplémentaires pour le filtre
  32. @simonbasle #PracticalRxJava Filter

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

  34. @simonbasle #PracticalRxJava Services à Migrer •RankingService • from pour rankByHashrate

    / RankByCoins • migration complète pour les autres méthodes
  35. @simonbasle #PracticalRxJava Opérateurs Utiles •takeUntil •count •take

  36. @simonbasle #PracticalRxJava TakeUntil

  37. @simonbasle #PracticalRxJava Count

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

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

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

  41. @simonbasle #PracticalRxJava PoolService •ajouter une ligne de log à chaque

    fois qu'un utilisateur se connecte
  42. @YourTwitterHandle #DVXFR14{session hashtag} @simonbasle #PracticalRxJava 6. Combiner

  43. @simonbasle #PracticalRxJava Niveau Sayen •concat

  44. @simonbasle #PracticalRxJava Niveau Sayen •merge

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

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

  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
  48. @YourTwitterHandle #DVXFR14{session hashtag} @simonbasle #PracticalRxJava On Arrête de Jouer

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

    (& Retry)
  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?
  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?)
  52. @simonbasle #PracticalRxJava Opérateurs Utiles •flatMap •skip •retry •onErrorReturn

  53. @simonbasle #PracticalRxJava Retry

  54. @simonbasle #PracticalRxJava OnErrorReturn

  55. Piège n°1

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

  57. skip ne génère pas d'erreur si on dépasse combiner un

    first/last Piège n°1
  58. Piège n°2

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

  60. just met en cache la valeur utiliser create pour régénérer

    à chaque essai Piège n°2
  61. @YourTwitterHandle #DVXFR14{session hashtag} @simonbasle #PracticalRxJava 8. Améliorer les Controllers

  62. @simonbasle #PracticalRxJava Réponse Asynchrone •Retourner du DeferredResult<T> •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
  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é)
  64. @YourTwitterHandle #DVXFR14{session hashtag} @simonbasle #PracticalRxJava 9. Enchaîner les Appels

  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
  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)
  67. Oh Hey! ! WARNING - Incoming Product Owner !

  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
  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
  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
  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
  72. @simonbasle #PracticalRxJava OnErrorResumeNext

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

  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