Top Banner
Czyli dwa pierwsze importy w architekturze rozproszonej RxJava & Hystrix Mateusz ‘Serafin’ Gajewski confitura 2015
48

RxJava & Hystrix - Perfect match for distributed applications

Aug 07, 2015

Download

Technology

allegro.tech
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: RxJava & Hystrix - Perfect match for distributed applications

Czyli dwa pierwsze importy w architekturze rozproszonej

RxJava & Hystrix

Mateusz ‘Serafin’ Gajewskiconfitura 2015

Page 2: RxJava & Hystrix - Perfect match for distributed applications

Kim jestem?

@wendigo

Solutions Architect obszarów:❖ Finansowego,❖ Płatnościowego,❖ Analityki danych

Główne zainteresowania:❖ Skalowalność,❖ Odporność na awarie,❖ Przetwarzanie danych,❖ Klastry obliczeniowe

Mateusz Gajewski

Page 3: RxJava & Hystrix - Perfect match for distributed applications

Agenda

❖ Rozproszone i reaktywne systemy,

❖ Jak ułatwić sobie życie narzędziami OSS,

❖ Kilka luźnych przemyśleń

Page 4: RxJava & Hystrix - Perfect match for distributed applications

Architektura rozproszona

Page 5: RxJava & Hystrix - Perfect match for distributed applications

Architektura rozproszona

Główne cechy:

❖ współbieżność komponentów,❖ niezależne awarie komponentów,❖ brak globalnego zegara

Page 6: RxJava & Hystrix - Perfect match for distributed applications

Czego oczekują użytkownicy?

Page 7: RxJava & Hystrix - Perfect match for distributed applications

Systemy reaktywne

❖ responsywność,❖ odporność na błędy,❖ elastyczność,❖ sterowanie zdarzeniami i wiadomościami

Page 8: RxJava & Hystrix - Perfect match for distributed applications

responsywność ~ górne ograniczenie na czas przetwarzania

potrzebne: optymalizacja i zrównoleglenie nieblokujących operacji

Page 9: RxJava & Hystrix - Perfect match for distributed applications

odporność ~ tolerancja na błędy i awarie

potrzebne: izolacja i obsługa

Page 10: RxJava & Hystrix - Perfect match for distributed applications

Platforma Allegro

❖ architektura master-master,

❖ 250+ mikrousług na JVM (kolejne w drodze),

❖ 4 prywatne AZ w 2 DC (4.500 VMs) + AWS,

❖ setki różnych technologii,

❖ dziesiątki niezależnych systemów storage’owych…

Page 11: RxJava & Hystrix - Perfect match for distributed applications

Co złego się może

wydarzyć?

Page 12: RxJava & Hystrix - Perfect match for distributed applications
Page 13: RxJava & Hystrix - Perfect match for distributed applications

Źródła opóźnień

❖ GC (JVM),❖ noisy neighbours (cloud),❖ stan sieci,❖ wolumen danych,❖ nieoptymalna implementacja,❖ obciążenie klastra...

Page 14: RxJava & Hystrix - Perfect match for distributed applications

Źródła awarii

❖ logika biznesowa,❖ implementacja techniczna,❖ problemy sieciowo-sprzętowe,❖ błąd operatora,❖ prawo Murphy’ego ;)

Page 15: RxJava & Hystrix - Perfect match for distributed applications

Smutna prawda:

spontaniczne awarie i wzrost czasów

odpowiedzi będą zdarzać się cały czas

Page 16: RxJava & Hystrix - Perfect match for distributed applications

Musimy nauczyć się niwelować ich efekty

używając odpowiednich narzędzi.

Page 17: RxJava & Hystrix - Perfect match for distributed applications

RxJava 1.0+ Hystrix 1.4+

&

Page 18: RxJava & Hystrix - Perfect match for distributed applications

RxJava

“Biblioteka do tworzenia asynchronicznych i opartych o

zdarzenia programów z wykorzystaniem obserwowalnych

sekwencji”

Page 19: RxJava & Hystrix - Perfect match for distributed applications

Programowanie reaktywne

Page 20: RxJava & Hystrix - Perfect match for distributed applications

Programowanie reaktywne

Page 21: RxJava & Hystrix - Perfect match for distributed applications

Observable<T>

onNext(T value)

onCompleted()

onError(Throwable t)

Observer API:

Page 22: RxJava & Hystrix - Perfect match for distributed applications

Observable<T> vs pozostałe typy

wartości skalarne sekwencje

sync T getData() Iterable<T> getData()

async Future<T> getData() Observable<T> getData()

Page 23: RxJava & Hystrix - Perfect match for distributed applications

Składanie operatorów

getDataFromNetwork() // Observable<T>

.skip(10)

.take(5)

.map(value -> value + " transformed")

.subscribe(value -> {

System.out.println("Received => " + value);

});

Page 24: RxJava & Hystrix - Perfect match for distributed applications

Jak nas to przybliża do responsywności i

odporności na błędy?

Page 25: RxJava & Hystrix - Perfect match for distributed applications

Cała magia leży w dostępnych operatorach

(100+) ;)

Page 26: RxJava & Hystrix - Perfect match for distributed applications

merge

źródło: http://reactivex.io

Page 27: RxJava & Hystrix - Perfect match for distributed applications

flatMap

źródło: http://reactivex.io

Page 28: RxJava & Hystrix - Perfect match for distributed applications

zipWith

źródło: http://reactivex.io

Page 29: RxJava & Hystrix - Perfect match for distributed applications

retry

źródło: http://reactivex.io

Page 30: RxJava & Hystrix - Perfect match for distributed applications

timeout

źródło: http://reactivex.io

Page 31: RxJava & Hystrix - Perfect match for distributed applications

onErrorResumeNext

źródło: http://reactivex.io

Page 32: RxJava & Hystrix - Perfect match for distributed applications

Zunifikowana obsługa błędów

a.zipWith(b, (x, y) -> x + " " + y)

.subscribe(

value -> { System.out.println("onNext(" + value + ")"); },

error -> { System.out.println("onError(" + error + ")"); },

() -> { System.out.println("onCompleted"); }

);

Page 33: RxJava & Hystrix - Perfect match for distributed applications

Reactive pull back-pressure

Operatory: onBackpressure*, sample, throttle,...

Page 34: RxJava & Hystrix - Perfect match for distributed applications

Przykład z warsztatów RX Allegro

client .getServices() // Observable<Service> .flatMap( service -> client .getInstances(service) // Observable<Instance> .onErrorResumeNext(Observable.<Instance>empty()) .timeout(500, TimeUnit.MILLISECONDS) .retry(3), 16) .subscribe(System.out::println);

Page 35: RxJava & Hystrix - Perfect match for distributed applications

RxJava - podsumowanie

❖ łatwe tworzenie kodu asynchronicznego,❖ zunifikowana obsługa błędów,❖ dostepność operatorów z zaawansowaną mechaniką (DRY),❖ wysoka wydajność (ring buffers FTW),❖ ukrywamy wewnętrzną implementację (sync vs async),❖ kontrola nad back-pressure,❖ testowalność kodu (wirtualny czas)

Page 36: RxJava & Hystrix - Perfect match for distributed applications

Hystrix

“Biblioteka zaprojektowana do kontroli opóźnień, zapewnienia

niezawodności oraz izolacji dostępu do zdalnych systemów. ”

Page 37: RxJava & Hystrix - Perfect match for distributed applications

Bezpiecznik

źródło: http://github.com/netflix/Hystrix

Page 38: RxJava & Hystrix - Perfect match for distributed applications

Hystrix(Observable)Command

Page 39: RxJava & Hystrix - Perfect match for distributed applications

Hystrix(Observable)Command =

logika biznesowa +logika statycznego fallbacku +

strategia izolacji +konfiguracja +

metryki

Page 40: RxJava & Hystrix - Perfect match for distributed applications

Strategia izolacji

Pozwala oddzielić od siebie, przerwać po przekroczeniu czasu i ograniczyć ilość równolegle wykonywanych komend:

❖ Oparta o pule wątków❖ Oparta o semafory

Page 41: RxJava & Hystrix - Perfect match for distributed applications

Etapy wykonywania

źródło: http://github.com/netflix/Hystrix

Page 42: RxJava & Hystrix - Perfect match for distributed applications

Izolacja

Izolujemy siebie od awarii zdalnego systemu

Chronimy zdalny system od “zalania” go żądaniami po odzyskaniu

sprawności

Page 43: RxJava & Hystrix - Perfect match for distributed applications

Co jeszcze fajnego?

❖ dynamiczna zmiana parametrów (Archaius),❖ strumień metryk (SSE),❖ dashboard (Turbine),❖ łatwe użycie za pomocą AOP,❖ batchowanie komend (Request Collapsing),❖ cache’owanie komend (Request Caching),❖ natywne wsparcie RxJava

Page 44: RxJava & Hystrix - Perfect match for distributed applications

RxJava + Hystrix = ❤

Page 45: RxJava & Hystrix - Perfect match for distributed applications

Wnioski

❖ programowanie asynchroniczne nie musi być trudne,

❖ domeny awarii mogą być ograniczone,❖ opóźnienia można kontrolować,❖ RxJava i Hystrix można wprowadzić w

każdym momencie życia projektu ;)

Page 46: RxJava & Hystrix - Perfect match for distributed applications

Pytania?

Page 47: RxJava & Hystrix - Perfect match for distributed applications

Dzięki!

Page 48: RxJava & Hystrix - Perfect match for distributed applications

Znajdziesz nas:Blog: allegrotech.io

Twitter: @allegrotechblog

pracuj z namikariera.allegro.pl