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

La Révolution Réactive - Bdx.io 2016

La Révolution Réactive - Bdx.io 2016

Un retour d'expérience sur la mise en place d'une plateforme de publication pour un groupe de presse français nous permettra de découvrir la "programmation réactive". Nous commencerons par une présentation du paradigme et ses cas d’usage. Puis l'étude de cas nous servira d'exemple sur son implémentation au sein d'un projet de taille conséquente et avec de fortes problématiques de performances. Enfin, nous ferons un tour des implémentations notamment au sein de la JVM (les réactives stream arrivent dans sa prochaine version) pour conclure sur le futur de l'écosystème réactif.

Arnaud LEMAIRE

October 21, 2016
Tweet

More Decks by Arnaud LEMAIRE

Other Decks in Programming

Transcript

  1. Reactive X • ReactiveX is a library for composing asynchronous

    and event-based programs by using observable sequences.
  2. Etat vs Evénement • Les évènements sont ponctuels dans le

    temps, ne peuvent être passés, chaque évènement est important et l’ordre doit être préservé • Malheureusement un évènement isolé est rarement intéressant • Un état est continue, il est définit en permanence mais peut être mis à jour • L’état est ce qui intéresse (le plus souvent) notre utilisateur
  3. Cas d’usages • Réagir à une action utilisateur • Réagir

    et traiter un processus externe asynchrone • Réagir à des évènements reçu depuis un système externe
  4. Des Iterables aux Observables getDataFromLocalMemorySynchronously()
 .skip(10)
 .limit(5)
 .map(s -> s

    + "_transformed")
 .forEach(System.out::println) Stream getDataFromNetworkAsynchronously()
 .skip(10)
 .take(5)
 .map(s -> s + "_transformed")
 .subscribe(System.out::println) Observable
  5. Observable Observable<Pair<String, Integer>> groceries = Observable
 .just("bread", "butter", "egg", "milk",

    "tomato", "cheese","tomato", "egg", "egg")
 .groupBy(prod -> prod)
 .flatMap(grouped -> grouped
 .count()
 .map(quantity -> {
 String productName = grouped.getKey();
 return Pair.of(productName, quantity);
 }))
 .forEach(e -> 
 System.out.println( String.format("%s: %d", e.getKey(), e.getValue()) ));
  6. Observable Observable<Status> observe() {
 return Observable.create(subscriber -> {
 TwitterStream twitterStream

    = 
 new TwitterStreamFactory().getInstance();
 twitterStream.addListener(new StatusListener() {
 @Override
 public void onStatus(Status status) {
 subscriber.onNext(status);
 }
 @Override
 public void onException(Exception ex) {
 subscriber.onError(ex);
 }
 });
 subscriber.add(Subscriptions.create(twitterStream::shutdown));
 });
 }
  7. Des collections aux observables private List<Person> query(String sql) {
 //...


    }
 
 List<Person> listPeople() {
 return query("SELECT * FROM PEOPLE");
 }
 
 Observable<Person> listPeople() {
 final List<Person> people = query("SELECT * FROM PEOPLE");
 return Observable.from(people);
 }
  8. Eager vers Lazy • La deuxième version n’exécutera la requête

    que si un subscribe est effectivement déclenché Observable<Person> listPeople() {
 final List<Person> people = query("SELECT * FROM PEOPLE");
 return Observable.from(people);
 }
 
 public Observable<Person> listPeople() {
 return Observable.defer(() ->
 Observable.from(query("SELECT * FROM PEOPLE")));
 }
  9. Producer & Subject • Les producers sont les sources de

    données (vous n’avez pas envie d’en écrire un) • Les subjects sont un mélange entre un observable et un producer, ils peuvent ainsi recevoir et émettre des évènements
  10. Hot & Cold • Les observables « cold » vont

    émettre leurs évènements uniquement si un subscribe est déclenché Observable A Subscribe Observable B Subscribe
  11. Hot & Cold • Les observables « hot » émettent

    en permanence des évènements (mouvement de la souris) Observable A Subscribe Observable B Subscribe
  12. BackPressure • Les observables « hot » émettent en permanence

    des évènements (mouvement de la souris) Observable A Subscribe Observable B Subscribe