Reactive programming is more than a catchy phrase nowadays.
More and more complicated web applications require great tools that sustain responsiveness and scalability.
Main topic of the presentation is introduction to the world of reactive programming. This presentation puts emphasis on the RxJS library, which is Javascript implementation of the reactive paradigm.
4. sunscrapers.comYour favored tech partner.
Czym jest programowanie reaktywne?
Reactive Programming Manifesto (http://www.reactivemanifesto.org/)
Cztery główne reguły RP:
- Responsive
- Scalable
- Resilent
- Message-driven architecuture
5. sunscrapers.comYour favored tech partner.
SPA (Single Page Application)
Aplikacja w przeglądarce
• strona pobierana raz
• mnóstwo logiki po stronie klienta
• strona nie przeładowywuje się
• dane (JSON, asynch, PUSH)
10. sunscrapers.comYour favored tech partner.
Observable na ratunek - Rx__
● Implementacje w wielu językach (JavaScript, Python, .Net, Java, Scala, Haskell, Closure, …)
● Duża społeczność i obszerne dokumentacje
● Używane przez dużych graczy na rynku (Netflix)
11. sunscrapers.comYour favored tech partner.
RxJS w praktyce
Wszystko w naszej aplikacji jest strumieniem
Sposób tworzenia strumienia:
- Z eventów (Event)
- Z NodeCallback
- Z tablicy (Array)
- Bezpośrednio: Observable.create
12. sunscrapers.comYour favored tech partner.
RxJS w praktyce
let observable = Observable.create((observer) =>
// some async operations
observer.onNext('hello'));
// or
observer.onError('Error occurs'));
// or
observer.onComplete('Stream ends’));
observable.subscribe(
(value) => console.log(value)
(err) => console.log(err)
);
16. sunscrapers.comYour favored tech partner.
Przykład: debouncer
function searchFor(text) {
var xhr = new XMLHttpRequest();
xhr.open('GET', apibaseUrl + '?q=' + text, true);
xhr.send();
return Rx.Observable.fromEvent(xhr, 'load').map(function (ev) {
var request = ev.currentTarget;
if (request.status === 200) {
var response = request.responseText;
return JSON.parse(response);
}
});
}
17. sunscrapers.comYour favored tech partner.
Wnioski
- Potężne narzędzie do pisania asynchronicznego kodu w różnych językach
- Rozwiązuje wiele problemów związanych z zarządzaniem zasobami i
zarządzaniem błędami
- Wspiera przy tworzeniu modularnego kodu
- Nacisk na stosowanie we współczesnych i przyszłych frameworkach SPA ( np.
React i Angular2)
W kilku zdaniach czym jest programowanie reaktywne
Rys historyczny aplikacji webowych w kontekcie reactive programming
Zastosowanie na przykładzie implementacji w języku Javascript - RxJS
Prosta struktura
Synchroniczny przepływ informacji
Rozbudowana struktura, zewnętrzne aplikacje, duża asynchroniczność w komunikacji
Problemy:
Wydajność – Tradycyjne blokujące wołanie oraz obsługa to cios dla klienta i serwera
● Niezawodność
– Części systemu mogą ulec awarii
– Komunikacja jest niepewna
– Zależymy od usług dostarczanych z zewnątrz
Dzięki podejściu reaktywnemu:
Sterowane zdarzeniami (event-driven) systemy mogą być:
– Skalowalne (scalable)
– Zdolne do samoleczenia (resilient)
● Dzięki czemu użytkownik obserwuje krótki czas reakcji (responsive)
Te zasady zostały niedawno sformułowane w „manifeście epoki” – Stanowią swojego rodzaju „koncepcyjny” wzorzec projektowy – Istotą jest uwzględnianie powyższych cech od początku tworzenia aplikacji, na jej wszystkich poziomach
Reactive Programming nie jest czymś nowym. Jest to sposób w jaki aplikacje używają eventów i reagują na nie. Stąd też nazwa.
Jest to coś co robiliśmy do tej pory w aplikacjach frontendowych, ustawiając listenery do eventów.
Lub w aplikacjach backendowych reagując na zdarzenia z systemu kolejkującego wiadomości (np. Rabbit MQ)
coraz więcej działa w chmurze. Klienci korzystają z WebService’u zleca wykonanie pewnych operacji.
Zdalne wywołania trwają dłużej niż lokalne metody, więc często zmuszeni jesteśmy wykonywać je w sposób asynchroniczny.
Współczesne języki programowania dają nam mechanizmy, które rozwiązują ten problem. Są nimi wywołania asynchroniczne i eventy.
Problem pojawia się, gdy chcemy koordynować kilka jednoczesnych wywołań asynchronicznych.
Co w sytuacji, gdy jedna z operacji zostanie anulowana, lub wystąpi nieoczekiwany błąd? Kod realizujący taki scenariusz staje się nieczytelny, a co za tym idzie - trudny w utrzymaniu i testowaniu.
Wzorzec Obserwatora: Używany jest do powiadamiania zainteresowanych obiektów o zmianie stanu pewnego innego obiektu.
Popularyzacja RP dzięki zapotrzebowaniu na dobre narzędzie do implementowania asynchroniczności w rozbudowanych aplikacjach. Powstało wiele implementacji w różnych językach programowania.
Manifest RP
Cztery reguły RP:
Responsive - Aplikacja responsywna ( nie w kontekście dostosowywania rozmiaru, a w kontekście reagowania na akcje użytkownika i komunikowania)
Scalable - wiąże się to ze współdzieleniem zasobów oraz danych. Ściśle związana z Responsive.
Resilient - elastyczność - zarówno gdy wszystko idzie zgodnie z planem, ale również gdy pojawiąja się problemy (np. Z zewnętrznymi aplikacjami)
Message-driven architecture - podstawa aplikacji RP - w przeciwieństwie do programowania imperatywnego, po wywołaniu funkcji nie musimy czekać na odpowiedź wstrzymując system
Spa renderuje się jak aplikacja desktopowa
Spa reaguje jak aplikacja desktopowa
Spa potrafi informować użytkownika o stanie aplikacji jak aplikacja desktopowa
Krok na przód w kierunku kontrolowania flow
Zarządzanie błędami - brak
Event notifications: yes
Managed control flow: noooo
Brak zwracanej wartości z callbacka
Implementacja stosowana szeroko we współczesnych frameworkach SPA, takich jak AngularJS
Minusy:
Reprezentuje tylko pojedyncza wartosc
Nie da się anulować
Lazy execution
Paradygmat Observable
Programowanie reaktywne to rozszerzenie wzorca Obserwatora
Observable object represents a push based collection
In reactive programming, all data coming in will be in a stream. These streams can be listened to, modified of course (filtered, merged...), and can even become a new stream that can be listened to. This technique allows for fairly decoupled programs: you don’t have to worry much about the consequences of your method call, you just raise an event, and every part of your app interested in this business will react accordingly. And maybe one of these parts will raise an event also, etc...
streams (Node.js), pipes (Unix) or async pipes (Angular 2).
Stream jest uporządkowanym zbiorem zdarzeń (eventów)
Event reprezentowany jest przez wartości, błędy oraz komunikat zakończenia strumienia. To wszystko pushowane jest od producenta do konsumenta strumienia
Stream to OBSERVABLE
Listener to OBSERVER
Naszym zadaniem jest subskrybcja do strumienia i obsługa tych trzech typów danych
Cała potęga w Rx leży w sposobie implementacji i stosowania.
Nie tworzymy funkcji, ktore bezpośrednio konsumują rezultat wywołania, a subskrybujemy wybrany strumień danych.
Strumienie są lazy. Dopóki nie ma subskrybcji, strumień jest nieaktywny.