SlideShare a Scribd company logo
Czyli dwa pierwsze importy w architekturze rozproszonej
RxJava & Hystrix
Mateusz ‘Serafin’ Gajewski
confitura 2015
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
Agenda
❖ Rozproszone i reaktywne systemy,
❖ Jak ułatwić sobie życie narzędziami OSS,
❖ Kilka luźnych przemyśleń
Architektura rozproszona
Architektura rozproszona
Główne cechy:
❖ współbieżność komponentów,
❖ niezależne awarie komponentów,
❖ brak globalnego zegara
Czego oczekują
użytkownicy?
Systemy reaktywne
❖ responsywność,
❖ odporność na błędy,
❖ elastyczność,
❖ sterowanie zdarzeniami i wiadomościami
responsywność ~ górne ograniczenie na
czas przetwarzania
potrzebne: optymalizacja i zrównoleglenie
nieblokujących operacji
odporność ~ tolerancja na błędy i awarie
potrzebne: izolacja i obsługa
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…
Co złego się może
wydarzyć?
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...
Źródła awarii
❖ logika biznesowa,
❖ implementacja techniczna,
❖ problemy sieciowo-sprzętowe,
❖ błąd operatora,
❖ prawo Murphy’ego ;)
Smutna prawda:
spontaniczne awarie i
wzrost czasów
odpowiedzi będą zdarzać
się cały czas
Musimy nauczyć się
niwelować ich efekty
używając odpowiednich
narzędzi.
RxJava 1.0+ Hystrix 1.4+
&
RxJava
“Biblioteka do tworzenia
asynchronicznych i opartych o
zdarzenia programów z
wykorzystaniem obserwowalnych
sekwencji”
Programowanie reaktywne
Programowanie reaktywne
Observable<T>
onNext(T value)
onCompleted()
onError(Throwable t)
Observer API:
Observable<T> vs pozostałe typy
wartości skalarne sekwencje
sync T getData() Iterable<T> getData()
async Future<T> getData() Observable<T> getData()
Składanie operatorów
getDataFromNetwork() // Observable<T>
.skip(10)
.take(5)
.map(value -> value + " transformed")
.subscribe(value -> {
System.out.println("Received => " + value);
});
Jak nas to przybliża do
responsywności i
odporności na błędy?
Cała magia leży w
dostępnych operatorach
(100+) ;)
merge
źródło: http://reactivex.io
flatMap
źródło: http://reactivex.io
zipWith
źródło: http://reactivex.io
retry
źródło: http://reactivex.io
timeout
źródło: http://reactivex.io
onErrorResumeNext
źródło: http://reactivex.io
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"); }
);
Reactive pull back-pressure
Operatory: onBackpressure*, sample, throttle,...
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);
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)
Hystrix
“Biblioteka zaprojektowana do
kontroli opóźnień, zapewnienia
niezawodności oraz izolacji dostępu
do zdalnych systemów. ”
Bezpiecznik
źródło: http://github.com/netflix/Hystrix
Hystrix(Observable)Command
Hystrix(Observable)Command =
logika biznesowa +
logika statycznego fallbacku +
strategia izolacji +
konfiguracja +
metryki
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
Etapy wykonywania
źródło: http://github.com/netflix/Hystrix
Izolacja
Izolujemy siebie od awarii zdalnego
systemu
Chronimy zdalny system od “zalania”
go żądaniami po odzyskaniu
sprawności
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
RxJava + Hystrix = ❤
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 ;)
Pytania?
Dzięki!
Znajdziesz nas:
Blog: allegrotech.io
Twitter: @allegrotechblog
pracuj z nami
kariera.allegro.pl

More Related Content

PDF
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
PDF
Confitura 2015 - Code Quality Keepers @ Allegro
PDF
Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach.
PDF
GraphQL w React z wykorzystaniem Apollo
PDF
Technologia Xamarin i wprowadzenie do Windows IoT core
PDF
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
PDF
Podstawy AngularJS
PDF
Budowa elementów GUI za pomocą biblioteki React - szybki start
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
Confitura 2015 - Code Quality Keepers @ Allegro
Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach.
GraphQL w React z wykorzystaniem Apollo
Technologia Xamarin i wprowadzenie do Windows IoT core
Monitoring systemu. Dlaczego mój kardiolog jest bogatym człowiekiem?
Podstawy AngularJS
Budowa elementów GUI za pomocą biblioteki React - szybki start

What's hot (16)

PDF
Monitoring sieci
PDF
NSOperation(Queue)
PPTX
Aplikacje internetowe real-time w oparciu o React/Redux
PDF
Krótka historia czasu - Confitura 2013
PPTX
4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...
PDF
Programowanie Równolegle - Parallel Extensions
PDF
Rundeck & Ansible
PDF
Infrastructure As Code
PPTX
Testowanie EDW czyli projekt piekło - Bartłomiej Nikiel
PPTX
Asynchroniczne testy JavaScript aplikacji webowych
PDF
Wprowadzenie do technologii Big Data
PPTX
ETW w służbie programisty .NET
PDF
Kubernetes: from zero to be hero
PDF
Wprowadzenie do testów wydajnościowych w k6
PDF
xlab #8 - Architektura mikroserwisów na platformie Spring Boot
PDF
4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski
Monitoring sieci
NSOperation(Queue)
Aplikacje internetowe real-time w oparciu o React/Redux
Krótka historia czasu - Confitura 2013
4Developers 2015: Orleans - aplikacje, które skalują i dystrybuują się same -...
Programowanie Równolegle - Parallel Extensions
Rundeck & Ansible
Infrastructure As Code
Testowanie EDW czyli projekt piekło - Bartłomiej Nikiel
Asynchroniczne testy JavaScript aplikacji webowych
Wprowadzenie do technologii Big Data
ETW w służbie programisty .NET
Kubernetes: from zero to be hero
Wprowadzenie do testów wydajnościowych w k6
xlab #8 - Architektura mikroserwisów na platformie Spring Boot
4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski
Ad

More from allegro.tech (7)

PPTX
allegro.tech Data Science Meetup #2: Elasticsearch w praktyce
PDF
Scaling infrastructure beyond containers
PDF
Confitura 2015 - Mikrousługi nie lubią być samotne
PDF
Microservices architecture pitfalls
PDF
RxJava - introduction & design
PDF
JDD 2014: Adam Dubiel - Import allegro.tech.internal.*
PDF
Fighting with scale
allegro.tech Data Science Meetup #2: Elasticsearch w praktyce
Scaling infrastructure beyond containers
Confitura 2015 - Mikrousługi nie lubią być samotne
Microservices architecture pitfalls
RxJava - introduction & design
JDD 2014: Adam Dubiel - Import allegro.tech.internal.*
Fighting with scale
Ad

RxJava & Hystrix - Perfect match for distributed applications