SlideShare a Scribd company logo
1 of 43
Download to read offline
Po co nam RSocket?
Piotr Kubowicz
@pkubowicz
$ whoami
Piotr Kubowicz
@pkubowicz
3 scenariusze
Scenariusz 1
➔ pobierz towary z zamówienia (serwis z wolną bazą)
➔ każdy towar niezależnie: jeśli mało w magazynie, każ uzupełnić
➔ nie da się uzupełnić: anulujemy zamówienie
➔ cel: fail fast
Warehouse service
➔ serwer (basket service): 0, 1, 2, … 49
➔ klient (warehouse service): . . . .
Uproszczenia
Reaktywny serwer (“order service”)
@GetMapping("/all")
public Flux<CountStep> getAll(
@RequestParam int delay,
@RequestParam int max) {
return countService.getCount(Duration.ofMillis(delay), max);
}
Reaktywny klient (“warehouse service”)
public interface CountSource {
Flux<CountStep> getAll(Duration serverDelay);
}
➔ Apache HttpClient (blokujący)
➔ HTTP (reaktywny)
➔ Event Stream (przez reaktywny HTTP)
➔ RSocket
Klient: sposoby komunikacji
Jak przyspieszyć?
Streaming przez Event Stream
Server-Sent Events
W3C ~2015
text/event-stream
Użycie SSE: serwer
@GetMapping("/all")
@GetMapping(path = "/all-stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
Użycie SSE: klient
return webClient.get().uri("/all")
.retrieve().bodyToFlux(CountStep.class);
private final ParameterizedTypeReference<ServerSentEvent<CountStep>> resultType =
new ParameterizedTypeReference<>() {};
return webClient.get().uri("/all-stream")
.retrieve().bodyToFlux(resultType)
.map(ServerSentEvent::data);
Streaming z SSE kontra reszta
A gdzie RSocket?
RSocket: kod serwera
@MessageMapping("count.all.{delay}.{max}")
public Flux<CountStep> getAll(
@DestinationVariable int delay,
@DestinationVariable int max) {
return countService.getCount(Duration.ofMillis(delay), max);
}
Backpressure
Klient: proszę trochę wolniej!
Serwer: ???
Protokół RSocket
➔ TCP
➔ WebSocket
➔ Aeron (UDP)
Protokół nad warstwą transportu
➔ request-response
➔ fire-and-forget
➔ request-stream
➔ channel
4 typy interakcji
➔ Mono<Payload> requestResponse(Payload payload)
➔ Mono<Void> fireAndForget(Payload payload)
➔ Flux<Payload> requestStream(Payload payload)
➔ Flux<Payload> requestChannel(Publisher<Payload> payloads)
4 typy interakcji (Java API)
➔ nawiązanie połączenia REQUEST_STREAM (REQUEST_N=3)
➔ w trakcie połączenia REQUEST_N (N=3)
Odwzorowanie Reactive Streams
➔ hamowanie klienta (ramka LEASE)
➔ wznawianie transmisji
➔ zero copy (Netty)
Dodatkowe możliwości
Nowa rzecz
początek 2015
2018: Spring pracuje nad integracją
środek 2019: gotowe
protokół “1.0 Release Candidate”
npm: 0.0.19
Scenariusz 2
➔ zamówienie z kodem rabatowym
➔ pobierz programy lojalnościowe aktywne u zamawiającego (wolne)
➔ odpytuj o kod, aż będzie rozpoznany
➔ cel: szybko znaleźć rabat
Coupon service
➔ serwer (customer loyalty service): 0, 1, 2, … 49
➔ klient (coupon service): 9 znaczy znaleziony
Uproszczenia
Scenariusz 3
➔ pobierz zamówienia z ich towarami
➔ upewnij się, że w zamówieniach nie ma duplikatów
➔ kosztowne: liczenie “sumy kontrolnej” zamówienia
➔ cel: grupa zamówień szybko wychodzi ze sklepu
Shipping service
➔ serwer (order service): 0, 1, 2, … 49
➔ klient (shipping service): sumowanie liczb = walidacja
Uproszczenia
Deduplikacja
counts
.collectList()
.subscribe(orders -> {
var duplicates = findDuplicates(orders);
if (duplicates.isEmpty())
// ...
});
Deduplikacja
counts
.collectList()
.subscribe(orders -> {
var duplicates = findDuplicates(orders);
if (duplicates.isEmpty())
// ...
});
counts
.reduce(new HashMap(), (map, order) -> putCheckingUniqueness(map, order))
.subscribe(map -> {
var orders = map.values();
});
➔ Czekanie na wszystko vs. krok po kroku
➔ Bez streamowania nie widać różnicy
Lepsze przetwarzanie
Wydajność
RSocket czy SSE?
Mieliśmy wolnego klienta i wolny serwer
Teraz szybki klient i szybki serwer
Podsumowanie
➔ Reaktywne nie znaczy szybsze
➔ Streaming: Server-Sent Events, RSocket
➔ RSocket kontroluje przepływ
➔ Nie ma nic za darmo
Po co nam RSocket?
YouTube: RSocket Messaging with Spring (przeglądarka,
bezpieczeństwo)
Web on Reactive Stack - Spring Docs
Piotr Kubowicz
@pkubowicz
github.com/pkubowicz/rsocket-counting
Dzięki
za uwagę
YouTube: RSocket Messaging with Spring (przeglądarka,
bezpieczeństwo)
Web on Reactive Stack - Spring Docs
Piotr Kubowicz
@pkubowicz
github.com/pkubowicz/rsocket-counting

More Related Content

More from Piotr Kubowicz

Mutation testing: Too good to be true? (Devoxx)
Mutation testing: Too good to be true? (Devoxx)Mutation testing: Too good to be true? (Devoxx)
Mutation testing: Too good to be true? (Devoxx)Piotr Kubowicz
 
Mutation testing: Too good to be true? (4Developers)
Mutation testing: Too good to be true? (4Developers)Mutation testing: Too good to be true? (4Developers)
Mutation testing: Too good to be true? (4Developers)Piotr Kubowicz
 
Lotny start z testami kontraktowymi 4Developers
Lotny start z testami kontraktowymi 4DevelopersLotny start z testami kontraktowymi 4Developers
Lotny start z testami kontraktowymi 4DevelopersPiotr Kubowicz
 
Lotny start z testami kontraktowymi
Lotny start z testami kontraktowymiLotny start z testami kontraktowymi
Lotny start z testami kontraktowymiPiotr Kubowicz
 
Flying Start into Contract Testing
Flying Start into Contract TestingFlying Start into Contract Testing
Flying Start into Contract TestingPiotr Kubowicz
 
Problem sprytnego programisty
Problem sprytnego programistyProblem sprytnego programisty
Problem sprytnego programistyPiotr Kubowicz
 
Czego oczekiwać od modułów w Javie 9
Czego oczekiwać od modułów w Javie 9Czego oczekiwać od modułów w Javie 9
Czego oczekiwać od modułów w Javie 9Piotr Kubowicz
 
Programista wychodzi z piwnicy
Programista wychodzi z piwnicy Programista wychodzi z piwnicy
Programista wychodzi z piwnicy Piotr Kubowicz
 

More from Piotr Kubowicz (8)

Mutation testing: Too good to be true? (Devoxx)
Mutation testing: Too good to be true? (Devoxx)Mutation testing: Too good to be true? (Devoxx)
Mutation testing: Too good to be true? (Devoxx)
 
Mutation testing: Too good to be true? (4Developers)
Mutation testing: Too good to be true? (4Developers)Mutation testing: Too good to be true? (4Developers)
Mutation testing: Too good to be true? (4Developers)
 
Lotny start z testami kontraktowymi 4Developers
Lotny start z testami kontraktowymi 4DevelopersLotny start z testami kontraktowymi 4Developers
Lotny start z testami kontraktowymi 4Developers
 
Lotny start z testami kontraktowymi
Lotny start z testami kontraktowymiLotny start z testami kontraktowymi
Lotny start z testami kontraktowymi
 
Flying Start into Contract Testing
Flying Start into Contract TestingFlying Start into Contract Testing
Flying Start into Contract Testing
 
Problem sprytnego programisty
Problem sprytnego programistyProblem sprytnego programisty
Problem sprytnego programisty
 
Czego oczekiwać od modułów w Javie 9
Czego oczekiwać od modułów w Javie 9Czego oczekiwać od modułów w Javie 9
Czego oczekiwać od modułów w Javie 9
 
Programista wychodzi z piwnicy
Programista wychodzi z piwnicy Programista wychodzi z piwnicy
Programista wychodzi z piwnicy
 

Po co nam RSocket?