Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

@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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

RxJava

Slide 5

Slide 5 text

RxJava

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

@simonbasle #PracticalRxJava Origines

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

@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é

Slide 11

Slide 11 text

L'application

Slide 12

Slide 12 text

Wow pool API? Much Legacy!

Slide 13

Slide 13 text

@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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

@simonbasle #PracticalRxJava Take

Slide 22

Slide 22 text

@simonbasle #PracticalRxJava Single

Slide 23

Slide 23 text

@simonbasle #PracticalRxJava SingleOrDefault

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

@simonbasle #PracticalRxJava FlatMap

Slide 28

Slide 28 text

@simonbasle #PracticalRxJava Reduce

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

@simonbasle #PracticalRxJava Filter

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

@simonbasle #PracticalRxJava TakeUntil

Slide 37

Slide 37 text

@simonbasle #PracticalRxJava Count

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

@simonbasle #PracticalRxJava Niveau Sayen •concat

Slide 44

Slide 44 text

@simonbasle #PracticalRxJava Niveau Sayen •merge

Slide 45

Slide 45 text

@simonbasle #PracticalRxJava Niveau Super-Sayen •zip

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

@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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

@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?

Slide 51

Slide 51 text

@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?)

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

@simonbasle #PracticalRxJava Retry

Slide 54

Slide 54 text

@simonbasle #PracticalRxJava OnErrorReturn

Slide 55

Slide 55 text

Piège n°1

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

Piège n°2

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

@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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

@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

Slide 66

Slide 66 text

@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)

Slide 67

Slide 67 text

Oh Hey! ! WARNING - Incoming Product Owner !

Slide 68

Slide 68 text

"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

Slide 69

Slide 69 text

"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

Slide 70

Slide 70 text

"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

Slide 71

Slide 71 text

@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

Slide 72

Slide 72 text

@simonbasle #PracticalRxJava OnErrorResumeNext

Slide 73

Slide 73 text

@YourTwitterHandle @YourTwitterHandle @simonbasle #PracticalRxJava Q & A

Slide 74

Slide 74 text

@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