26
Reaktív programozás szerver oldalon Tóth Márton Supercharge

Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

Reaktív programozás szerver oldalon

Tóth MártonSupercharge

Page 2: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

AgendaReaktív programozás szerver oldalon

■ Reactive streams

■ Spring WebFlux

■ Reactive Spring Data

■ Benchmarks

■ Konklúzió

Page 3: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

Reactive streams

Page 4: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

Reactive streamsReaktív programozás szerver oldalon

■ Reaktív programozási modell

■ Aszinkron adatfeldolgozó folyamok non-blocking backpressure-rel

■ Aszinkron: egy szálon több feldolgozás

■ Non-blocking: A feldolgozó szálon nem végzünk blokkoló műveletet

■ Backpressure: A fogyasztó lassabb mint a termelő

■ Specifikáció, több implementációval: http://reactive-streams.org

■ RxJava, ReactiveX, Java 9 Flow...

Page 5: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

Mire jó ez az egész?Reaktív programozás szerver oldalon

■ Szálak: overhead

■ Szál indítás, szálak közti váltás, stack memória...

■ Aszinkronitás: kevés szállal elvégezhető ugyanaz a munka

■ Jobb áteresztőképesség, kiszámíthatóbb viselkedés terhelés alatt

Page 6: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

Reactive flowReaktív programozás szerver oldalon

Publisher Subscriber

Subscription

1 subscribe()

2 onSubscribe(Subscription)

3 request(n)

4 onNext(o)

Page 7: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

Reactive flowReaktív programozás szerver oldalon

Publisher Subscriber

Subscription

1 subscribe()

2 onSubscribe(Subscription)

3 request(n)

4 onNext(o)

Page 8: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

Reactive flowReaktív programozás szerver oldalon

Publisher Subscriber

Subscription

1 subscribe()

2 onSubscribe(Subscription)

3 request(n)

4 onNext(o)

Page 9: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

Reactive flowReaktív programozás szerver oldalon

Publisher Subscriber

Subscription

1 subscribe()

2 onSubscribe(Subscription)

3 request(n)

4 onNext(o)

Page 10: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

Reactive flowReaktív programozás szerver oldalon

Publisher Subscriber

Subscription

1 subscribe()

2 onSubscribe(Subscription)

3 request(n)

4 onNext(o)

Page 11: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

Reactor projectReaktív programozás szerver oldalon

■ Reactive streams implementáció

■ API-ja hasonlít a Java Stream API-hoz

■ Források: Flux, Mono

■ Operátorok: map, flatMap, zip, filter, cache, stb...

Page 12: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

PéldaReaktív programozás szerver oldalon

Flux.fromIterable(animals)

.map(String::toUpperCase)

.filter(a -> a.contains("O"))

.subscribe(System.out::println);

List<String> animals = ImmutableList.of("dog", "cat", "unicorn");

animals.stream()

.map(String::toUpperCase)

.filter(a -> a.contains("O"))

.forEach(System.out::println);

Stream API Reactor

Page 13: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

Spring + Reactive = WebFlux

Page 14: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

Spring WebFluxReaktív programozás szerver oldalon

■ Reaktív web keretrendszer

■ Kliens és szerver implementáció

■ Reactor project

■ Spring Web MVC alternatíva

■ Mellett, nem helyett

Page 15: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

WebFlux példaReaktív programozás szerver oldalon

@RestController

public class Controller {

@GetMapping

public Mono<String> handle() {

return Mono.just("unicorn")

.flatMapMany(s ->

Flux.fromArray(s.split(""))

)

.filter(s -> !s.equals("o"))

.collect(Collectors.joining());

}

}

■ Spring Web MVC annotációk

■ Handler metódusok visszatérési értéke

Flux vagy Mono

■ A streamre a framework iratkozik fel

■ A streamet tilos blokkolni

Page 16: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

Mi blokkol jellemzően szerver oldalon?Reaktív programozás szerver oldalon

■ Hálózat

■ HTTP: WebClient

■ Egyéb: reactor-netty, salesforce/reactive-grpc, stb

■ Fájl műveletek

■ Java NIO, Stream API

■ Adatbázisok

■ Spring Data

Page 17: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

Non-blocking Spring DataReaktív programozás szerver oldalon

■ Flux, Mono egyenesen a Repository-kból

■ NoSQL adatbázisok

■ MongoDB, Cassandra, Couchbase, Redis…

■ Relációs adatbázisok

■ JDBC...

Page 18: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking
Page 19: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

R2DBC to the rescueReaktív programozás szerver oldalon

■ Nem blokkoló adatbázis connector

■ Postgres, MSSQL, H2, MySQL

■ Spring Data R2DBC

■ Standard Spring Data Repository-k

■ Lightweight mapping, nem ORM

■ Nincs: caching, lazy loading, write behind, egyéb feketemágia

■ Nagyon fiatal projekt

Page 20: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

Benchmarks

Page 21: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

SetupReaktív programozás szerver oldalon

■ 2 Alkalmazás

■ Web MVC vs WebFlux

■ 1 másodperces késleltetésű szolgáltatás meghívása

■ REST interfész

■ AWS EC2 t3.micro

■ 1 GiB RAM, 2 vCPU

■ JMeter load test, külön EC2 instance-ről

Page 22: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

Reaktív programozás szerver oldalon

Throughput (per second)

Page 23: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking
Page 24: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

KonklúzióReaktív programozás szerver oldalon

■ Használd ha

■ Várhatóan nagy lesz a terhelés

■ Nem rettensz meg az érdekes framework bugoktól 🐛

■ Ne használd ha

■ Nem követelmény a brutális áteresztőképesség

■ Kevésbé tapasztalt a csapatod

Page 25: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking

We are [email protected]

Page 26: Supercharge Reaktív programozás szerver oldalon · Egyéb: reactor-netty, salesforce/reactive-grpc, stb Fájl műveletek Java NIO, Stream API Adatbázisok Spring Data. Non-blocking