r2dbc - kotlin belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 cpu/request....
TRANSCRIPT
![Page 1: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/1.jpg)
R2DBC
![Page 2: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/2.jpg)
2
Поиграем в игру?● ODBC
– Open Database Connectivity● JDBC
– Java Database Connectivity● R2DBC
– Reactive Relation Database Connectivity
![Page 3: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/3.jpg)
3
Поиграем в игру?● ODBC
– 26● JDBC
– 21● R2DBC
– ~1
![Page 4: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/4.jpg)
4
R2DBC● Reactive Streams - R2DBC is founded
on Reactive Streams providing an asynchronous, non-blocking API
● Relational Databases - R2DBC engages relational databases with a reactive API, something not possible with the blocking nature of JDBC and JPA
![Page 5: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/5.jpg)
5
Why Reactive
![Page 6: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/6.jpg)
6
Reactive API vs Coroutines API
Reactive Coroutines
Single Value fun single(): Mono<T> suspend fun single(): T
Cold Stream fun coldStream(): Flux<T> -
Hot Stream fun hotStream(): Flux<T> fun hotStream(): ReceiveChannel<T>
![Page 7: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/7.jpg)
7
![Page 8: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/8.jpg)
8
![Page 9: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/9.jpg)
9
Why not ADBA?● Not Reactive● Java 12 – no way (Java 17 maybe, 2021)
var result: CompletableFuture<List<Map<String, Any>>>
ds.getSession().use({ session ->
val submit = session .rowOperation("SELECT id, name, manual FROM legoset") .collect(collectToMap()) .submit()
result = submit.getCompletionStage().toCompletableFuture()})
![Page 10: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/10.jpg)
10
Relational
![Page 11: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/11.jpg)
11
Non-Blocking● CPU/RAM consumption per request● Latency under load
a
b
c
d
b
c
d
x
a
a
b
b
a
Sync. I/O Async. I/O
database database
sendRequest(x) x receiveResponse(x) wait
![Page 12: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/12.jpg)
12
RxNetty vs Tomcat
https://www.slideshare.net/brendangregg/rxnetty-vs-tomcat-performance-results
![Page 13: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/13.jpg)
13
CPU/Request
![Page 14: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/14.jpg)
14
Request rate
![Page 15: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/15.jpg)
15
Reqest Latency (avg)
![Page 16: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/16.jpg)
16
Reqest Latency (max)
![Page 17: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/17.jpg)
17
R2DBC● r2dbc-spi● r2dbc-client● r2dbc-postgresql● r2dbc-over-adba
![Page 18: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/18.jpg)
18
Supported DBs
● PostgreSQL● H2● Microsoft SQL Server
![Page 19: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/19.jpg)
19
Connectionval connectionFactory = PostgresqlConnectionFactory( PostgresqlConnectionConfiguration.builder() .host("localhost") .database("bkug") .username("bkug") .password("password").build())
![Page 20: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/20.jpg)
20
Select SPIconnectionFactory.create() .flatMapMany { conn >> conn.createStatement("SELECT value FROM bkug") .execute() .flatMap { result >> result.map { row, meta >> row.get("value") } } }
![Page 21: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/21.jpg)
21
Insert SPIconnectionFactory.create() .flatMapMany { conn >> conn.createStatement( "INSERT INTO table (id, name, manual) VALUES($1, $2, $3)") .bind("$1", 42055) .bind("$2", "Description") .bindNull("$3", Integer>:class.java) .execute() }
![Page 22: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/22.jpg)
22
Insert Transactional SPIconnectionFactory.create() .flatMapMany { conn >> conn.beginTransaction() .thenMany(conn.createStatement( "INSERT INTO table (id, name, manual) VALUES($1, $2, $3)") .bind("$1", 42055) .bind("$2", "Description") .bindNull("$3", Integer>:class.java) .execute()) .delayUntil { conn.commitTransaction() } .onErrorResume { e >> conn.rollbackTransaction().then(Mono.error(e)) }
}
![Page 23: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/23.jpg)
23
Select Client
val r2dbc = R2dbc(connectionFactory)
r2dbc.withHandle { handle >> handle.select("SELECT value FROM bkug") .mapRow { row >> row.get("value") }}
![Page 24: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/24.jpg)
24
Insert Client
r2dbc.withHandle { handle >> handle.createUpdate("INSERT INTO bkug VALUES($1, $2)") .bind("$1", 100) .bind("$2", 200) .execute()}
![Page 25: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/25.jpg)
25
Insert Transactional Client
r2dbc.inTransaction { handle >> handle.createUpdate("INSERT INTO bkug VALUES($1, $2)") .bind("$1", 100) .bind("$2", 200) .execute()}
![Page 26: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/26.jpg)
26
Insert Transactional Client
r2dbc.inTransaction { handle >> handle.createUpdate("INSERT INTO bkug VALUES($1, $2)") .bind("$1", 100) .bind("$2", 200) .execute()}
![Page 27: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/27.jpg)
27
Spring Data R2DBC
interface CustomerRepository extends ReactiveCrudRepository<Customer, Long> {
@Query("select id, firstname, lastname from customer c where c.lastname = $1")Flux<Customer> findByLastnameLike(String lastname);
}
![Page 28: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/28.jpg)
28
Spring Data R2DBCSpring Fu
suspend fun count() = client.execute() .sql("SELECT COUNT(*) FROM users").fetch().one()
suspend fun findAll() = client.select() .from("users").asType(User>:class).fetch().all()
suspend fun findOne(id: String) = client.execute() .sql("SELECT * FROM users WHERE login = \$1") .bind(1, id).fetch().one()
![Page 29: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/29.jpg)
29
Benchmarks
![Page 30: R2DBC - Kotlin Belarus · 2018. 12. 12. · rxnetty-vs-tomcat-performance-results. 13 CPU/Request. 14 Request rate. 15 Reqest Latency (avg) 16 Reqest Latency (max) 17 R2DBC](https://reader035.vdocuments.mx/reader035/viewer/2022081403/60a1598e715f335e993c3ca8/html5/thumbnails/30.jpg)
30
Fin!