SlideShare a Scribd company logo
Full Steam Ahead!
Mark Paluch • Spring Data Project Lead, R2DBC Contributor • @mp911de
Reactive Relational Database Connectivity
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Mark Paluch
● Spring Data, R2DBC,
Lettuce Redis Driver
● All things non-blocking
● @mp911de (Twitter, GitHub)
3
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 4
2009
Microsoft to release .NET 4.0
2013
Reactive Manifesto
Initial Akka release
2014
RxJava 1.0
2015
Reactive Streams 1.0
Project Reactor 2.0
2016
RxJava 2.0
Akka Streams 1.0
Ratpack
Spring WebFlux
Micronaut
Today
RSocket
Reactive Mongo
Lettuce
Cassandra
vert.x
Lagom
Apple Servicetalk
Helidon
RxJava 3.0
Project Reactor 3.0
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Programming Models Have Changed
● Reactive applications typically stream-processing
● Push-based models
● Notifications, Events
● Is SQL the right choice for reactive applications?
● Depends on the Use-Case
5
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactive Programming
● High-efficiency applications
● Fundamentally non-blocking
● No opinion on async
● Key differentiators: (pull-push) back pressure, flow control
6
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Persistence
● ✅ Kafka
● ✅ MongoDB
● ✅ Cassandra
● ✅ Couchbase
● ✅ Redis
● ❌ Oracle, DB2, MySQL, MariaDB, Postgres, SQL Server*
7
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Persistence
● ✅ Kafka
● ✅ MongoDB
● ✅ Cassandra
● ✅ Couchbase
● ✅ Redis
● ❌ Oracle, DB2, MySQL, MariaDB, Postgres, SQL Server*
8
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Non-blocking SQL Persistence (1/3)
● MySQL: X DevAPI (Document Store API): CompletableFuture
● vert.x Postgres Driver: Callback API
● jasync-sql: CompletableFuture
● Common API 🤕
9
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Non-blocking SQL Persistence (2/3)
● JDBC on ThreadPool
● RxJava JDBC
● Blocks still threads
● Project Loom: Production readiness unknown
● Requires proper queuing and capacity controls
10
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Non-blocking SQL Persistence (3/3)
● ADBA (Asynchronous Database API)
● Standard-API
● Based heavily on CompletableFuture
● Discontinued in favor of Project Loom
11
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 12
Standard API
for reactive programming
with SQL databases
on the JVM
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Project of
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Design Principles
● Embrace Reactive Types and Patterns
● Low barrier to entry (depends on Reactive Streams and Java 8 only)
● Non-blocking, all the way to the database
● De-duplicate driver efforts
● Documented specification
● Shrink the driver SPI
● Enable multiple "humane" APIs
14
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Simple Select
15
Publisher<String> values = connectionFactory.create()
.flatMapMany(conn ->
conn.createStatement("SELECT value FROM test")
.execute()
.flatMap(result ->
result.map((row, metadata) -> row.get("value",
String.class))))
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
R2DBC 0.8
● Stable release
● End-to-end reactive non-blocking database communication
● Batching
● BLOB/CLOB
● Extensive Type Conversion
● Savepoints
● Transactions
● Leveraging Database-specific features
● ServiceLoader-based Driver discovery
● Connection URLs
● Categorized exceptions (Bad grammar, Data integrity violation, …)
16
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
R2DBC 0.9 / 1.0
● Evolution of the specification
● Extended transaction spec
● Improved In/Out Parameter Bindings
● Investigation on stored procedures
● No real demand so far
● Scheduled for 2021
17
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
R2DBC Ecosystem
● Specification document
● R2DBC SPI
● R2DBC Proxy
● Connection Pooling
● Client Implementations
● Spring
● Querydsl
● R2DBC Migrate
● Kotysa
● Testcontainers
● Driver Community
● Google Cloud Spanner
● H2
● Microsoft SQL Server
● MySQL Driver (r2dbc-mysql,
jasync-sql)
● MariaDB
● PostgreSQL
● SAP Hana
● Oracle (work in progress)
● DB2 (work in progress)
18
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Community Projects
● Specification document
● R2DBC SPI
● R2DBC Proxy
● Connection Pooling
● Client Implementations
● Spring
● Querydsl
● R2DBC Migrate
● Kotysa
● Testcontainers
● Driver Community
● Google Cloud Spanner
● H2
● Microsoft SQL Server
● MySQL Driver (r2dbc-mysql,
jasync-sql)
● MariaDB
● PostgreSQL
● SAP Hana
● Oracle (work in progress)
● DB2 (work in progress)
19
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
R2DBC Clients: Work in Progress
● MyBatis (#1444)
● JDBI (#1454)
● jOOQ (#6298)
● Querydsl (#2468)
● Liquibase (CORE-3419)
● Flyway (#2502)
● Exposed (#456)
● Micronaut (#416)
● Go vote for a client you want to see happen.
20
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
What R2DBC gives you
● Move Thread congestion out of JVM
● Achieve more with less Threads
● Doesn’t change law of physics
● Follow well-known SQL database interaction patterns
● Database laws still apply
● Obey wire protocol rules
● ACID rules
21
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Spring ❤ R2DBC
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Spring and R2DBC
● 2018/2019
● First steps with Spring Data R2DBC 1.0
● 2020
● Migration of core R2DBC support from Spring Data to Spring
Framework 5.3
● Deprecations in Spring Data R2DBC 1.2
23
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Spring R2DBC
● Central class: DatabaseClient
● BindMarker SPI
● Reactive Transaction Manager
● Schema initialization support
● ConnectionFactory implementations (e.g.
AbstractRoutingConnectionFactory)
24
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
DatabaseClient
DatabaseClient client = DatabaseClient.create(connectionFactory);
Flux<Person> people = client
	 	 .sql("SELECT firstname, lastname FROM person WHERE age > :age")
	 	 .bind("age", 42)
.filter(statement -> statement.fetchSize(20))
	 	 .map(row -> new Person(row.get("firstname", String.class),
row.get("lastname", String.class)))
	 	 .all();
25
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
ConnectionFactoryInitializer
@Bean
ConnectionFactoryInitializer initializer(ConnectionFactory connectionFactory) {
	 ConnectionFactoryInitializer initializer = new ConnectionFactoryInitializer();
	 initializer.setConnectionFactory(connectionFactory);
	 initializer.setDatabasePopulator(new ResourceDatabasePopulator(
new ClassPathResource("schema.sql")));
	 return initializer;
}
26
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Spring Data R2DBC
● Mapped entity support through R2dbcEntityOperations
● Query and Update objects
● Dialect-awareness
● Repository abstraction
● Sorry, no mapped relations yet
27
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
R2dbcEntityTemplate
R2dbcEntityTemplate entityTemplate = …;
Flux<Person> people = entityTemplate.select(Person.class)
	 	 .from("people")
	 	 .matching(query(where("age").greaterThan(42))
.limit(10)
.offset(20)
.sort(by("firstname")))
	 	 .all();
28
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
R2dbcEntityTemplate
R2dbcEntityTemplate entityTemplate = …;
Flux<Person> people = entityTemplate.select(Person.class)
	 	 .from("people")
	 	 .matching(query(where("age").greaterThan(42))
.limit(10)
.offset(20)
.sort(by("firstname")))
	 	 .all();
29
query(where("age").greaterThan(42))
.limit(10)
.offset(20)
.sort(by("firstname"))
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Repositories
interface PersonRepository extends ReactiveSortingRepository<Person, Integer> {
	 Flux<Person> findByFirstnameContains(String name);
	 Flux<Person> findFirst10By();
	 Flux<Person> findAllByOrderByLastname(Pageable pageable);
	 @Modifying
	 @Query("DELETE FROM person WHERE age = :age")
	 Mono<Void> deleteAllByAge(int age);
	 @Modifying
	 @Query("DELETE FROM person")
	 Mono<Integer> deleteAllAndReturnCount();
}
30
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Spring Data R2DBC 1.2: New and Noteworthy
● Entity Callbacks
● Before/After Convert, Before/After Save
● Auditing
● SpEL Context Extensions
● Enum value revision
● Repository metrics SPI
31
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Entity Callbacks
@FunctionalInterface
interface BeforeConvertCallback<T> extends EntityCallback<T> {
Publisher<T> onBeforeConvert(T entity, SqlIdentifier table);
}
32
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Entity Callback in Action
@Bean
BeforeConvertCallback<Person> autogeneratedId(DatabaseClient client) {
return (entity, table) -> {
if (entity.getId() == null) {
return client.sql("SELECT nextval('person_seq')")
.map(row -> row.get(0, Integer.class))
.first()
.map(entity::withId);
}
return Mono.just(entity);
};
}
33
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Outlook: Spring Data R2DBC 2.0
● Closer alignment of Spring Data JDBC and Spring Data R2DBC
● Evolution of Spring Data Relational
34
Thank you.
r2dbc.io
@mp911de
Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Resources
● Website
https://r2dbc.io
● Twitter
@r2dbc
● GitHub
https://github.com/r2dbc
● Mailing List
https://groups.google.com/forum/
#!forum/r2dbc
● Monthly Call
1st Friday of Month
0630 PT/0930 ET/1530 CET
36

More Related Content

What's hot

Spring Cloud Function: Where We Were, Where We Are, and Where We’re Going
Spring Cloud Function: Where We Were, Where We Are, and Where We’re GoingSpring Cloud Function: Where We Were, Where We Are, and Where We’re Going
Spring Cloud Function: Where We Were, Where We Are, and Where We’re GoingVMware Tanzu
 
Spring Boot on Amazon Web Services with Spring Cloud AWS
Spring Boot on Amazon Web Services with Spring Cloud AWSSpring Boot on Amazon Web Services with Spring Cloud AWS
Spring Boot on Amazon Web Services with Spring Cloud AWSVMware Tanzu
 
Spring Boot Observability
Spring Boot ObservabilitySpring Boot Observability
Spring Boot ObservabilityVMware Tanzu
 
Spring Data JDBC: Beyond the Obvious
Spring Data JDBC: Beyond the ObviousSpring Data JDBC: Beyond the Obvious
Spring Data JDBC: Beyond the ObviousVMware Tanzu
 
State of Steeltoe 2020
State of Steeltoe 2020State of Steeltoe 2020
State of Steeltoe 2020VMware Tanzu
 
Spring Native and Spring AOT
Spring Native and Spring AOTSpring Native and Spring AOT
Spring Native and Spring AOTVMware Tanzu
 
Introducing Spring Cloud Gateway and API Hub for VMware Tanzu
Introducing Spring Cloud Gateway and API Hub for VMware TanzuIntroducing Spring Cloud Gateway and API Hub for VMware Tanzu
Introducing Spring Cloud Gateway and API Hub for VMware TanzuVMware Tanzu
 
Automated Virtualized Testing (AVT) with Docker, Kubernetes, WireMock and Gat...
Automated Virtualized Testing (AVT) with Docker, Kubernetes, WireMock and Gat...Automated Virtualized Testing (AVT) with Docker, Kubernetes, WireMock and Gat...
Automated Virtualized Testing (AVT) with Docker, Kubernetes, WireMock and Gat...VMware Tanzu
 
Micronaut: A new way to build microservices
Micronaut: A new way to build microservicesMicronaut: A new way to build microservices
Micronaut: A new way to build microservicesLuram Archanjo
 
“Sh*^%# on Fire, Yo!”: A True Story Inspired by Real Events
“Sh*^%# on Fire, Yo!”: A True Story Inspired by Real Events“Sh*^%# on Fire, Yo!”: A True Story Inspired by Real Events
“Sh*^%# on Fire, Yo!”: A True Story Inspired by Real EventsVMware Tanzu
 
Spring: Your Next Java Micro-Framework
Spring: Your Next Java Micro-FrameworkSpring: Your Next Java Micro-Framework
Spring: Your Next Java Micro-FrameworkVMware Tanzu
 
Walking Through Spring Cloud Data Flow
Walking Through Spring Cloud Data FlowWalking Through Spring Cloud Data Flow
Walking Through Spring Cloud Data FlowVMware Tanzu
 
Improving Your Company’s Health with Middleware Takeout
Improving Your Company’s Health with Middleware TakeoutImproving Your Company’s Health with Middleware Takeout
Improving Your Company’s Health with Middleware TakeoutVMware Tanzu
 
The Path Towards Spring Boot Native Applications
The Path Towards Spring Boot Native ApplicationsThe Path Towards Spring Boot Native Applications
The Path Towards Spring Boot Native ApplicationsVMware Tanzu
 
What’s New in Spring Data MongoDB
What’s New in Spring Data MongoDBWhat’s New in Spring Data MongoDB
What’s New in Spring Data MongoDBVMware Tanzu
 
Spring Boot—Production Boost
Spring Boot—Production BoostSpring Boot—Production Boost
Spring Boot—Production BoostVMware Tanzu
 
Peering Inside the Black Box: A Case for Observability
Peering Inside the Black Box: A Case for ObservabilityPeering Inside the Black Box: A Case for Observability
Peering Inside the Black Box: A Case for ObservabilityVMware Tanzu
 
Developers Are Users, Too
Developers Are Users, TooDevelopers Are Users, Too
Developers Are Users, TooVMware Tanzu
 
Ingress? That’s So 2020! Introducing the Kubernetes Gateway API
Ingress? That’s So 2020! Introducing the Kubernetes Gateway APIIngress? That’s So 2020! Introducing the Kubernetes Gateway API
Ingress? That’s So 2020! Introducing the Kubernetes Gateway APIVMware Tanzu
 

What's hot (20)

Spring Cloud Function: Where We Were, Where We Are, and Where We’re Going
Spring Cloud Function: Where We Were, Where We Are, and Where We’re GoingSpring Cloud Function: Where We Were, Where We Are, and Where We’re Going
Spring Cloud Function: Where We Were, Where We Are, and Where We’re Going
 
Spring Boot on Amazon Web Services with Spring Cloud AWS
Spring Boot on Amazon Web Services with Spring Cloud AWSSpring Boot on Amazon Web Services with Spring Cloud AWS
Spring Boot on Amazon Web Services with Spring Cloud AWS
 
Spring Boot Observability
Spring Boot ObservabilitySpring Boot Observability
Spring Boot Observability
 
Spring Data JDBC: Beyond the Obvious
Spring Data JDBC: Beyond the ObviousSpring Data JDBC: Beyond the Obvious
Spring Data JDBC: Beyond the Obvious
 
State of Steeltoe 2020
State of Steeltoe 2020State of Steeltoe 2020
State of Steeltoe 2020
 
Spring Native and Spring AOT
Spring Native and Spring AOTSpring Native and Spring AOT
Spring Native and Spring AOT
 
Introducing Spring Cloud Gateway and API Hub for VMware Tanzu
Introducing Spring Cloud Gateway and API Hub for VMware TanzuIntroducing Spring Cloud Gateway and API Hub for VMware Tanzu
Introducing Spring Cloud Gateway and API Hub for VMware Tanzu
 
Automated Virtualized Testing (AVT) with Docker, Kubernetes, WireMock and Gat...
Automated Virtualized Testing (AVT) with Docker, Kubernetes, WireMock and Gat...Automated Virtualized Testing (AVT) with Docker, Kubernetes, WireMock and Gat...
Automated Virtualized Testing (AVT) with Docker, Kubernetes, WireMock and Gat...
 
Micronaut: A new way to build microservices
Micronaut: A new way to build microservicesMicronaut: A new way to build microservices
Micronaut: A new way to build microservices
 
“Sh*^%# on Fire, Yo!”: A True Story Inspired by Real Events
“Sh*^%# on Fire, Yo!”: A True Story Inspired by Real Events“Sh*^%# on Fire, Yo!”: A True Story Inspired by Real Events
“Sh*^%# on Fire, Yo!”: A True Story Inspired by Real Events
 
Spring: Your Next Java Micro-Framework
Spring: Your Next Java Micro-FrameworkSpring: Your Next Java Micro-Framework
Spring: Your Next Java Micro-Framework
 
Walking Through Spring Cloud Data Flow
Walking Through Spring Cloud Data FlowWalking Through Spring Cloud Data Flow
Walking Through Spring Cloud Data Flow
 
Improving Your Company’s Health with Middleware Takeout
Improving Your Company’s Health with Middleware TakeoutImproving Your Company’s Health with Middleware Takeout
Improving Your Company’s Health with Middleware Takeout
 
The Path Towards Spring Boot Native Applications
The Path Towards Spring Boot Native ApplicationsThe Path Towards Spring Boot Native Applications
The Path Towards Spring Boot Native Applications
 
From Monolith to K8s - Spring One 2020
From Monolith to K8s - Spring One 2020From Monolith to K8s - Spring One 2020
From Monolith to K8s - Spring One 2020
 
What’s New in Spring Data MongoDB
What’s New in Spring Data MongoDBWhat’s New in Spring Data MongoDB
What’s New in Spring Data MongoDB
 
Spring Boot—Production Boost
Spring Boot—Production BoostSpring Boot—Production Boost
Spring Boot—Production Boost
 
Peering Inside the Black Box: A Case for Observability
Peering Inside the Black Box: A Case for ObservabilityPeering Inside the Black Box: A Case for Observability
Peering Inside the Black Box: A Case for Observability
 
Developers Are Users, Too
Developers Are Users, TooDevelopers Are Users, Too
Developers Are Users, Too
 
Ingress? That’s So 2020! Introducing the Kubernetes Gateway API
Ingress? That’s So 2020! Introducing the Kubernetes Gateway APIIngress? That’s So 2020! Introducing the Kubernetes Gateway API
Ingress? That’s So 2020! Introducing the Kubernetes Gateway API
 

Similar to Full Steam Ahead, R2DBC!

Spring Update | July 2023
Spring Update | July 2023Spring Update | July 2023
Spring Update | July 2023VMware Tanzu
 
Modernizing Web Apps with .NET 6.pptx
Modernizing Web Apps with .NET 6.pptxModernizing Web Apps with .NET 6.pptx
Modernizing Web Apps with .NET 6.pptxEd Charbeneau
 
Modernizing Web Apps with .NET 6.pptx
Modernizing Web Apps with .NET 6.pptxModernizing Web Apps with .NET 6.pptx
Modernizing Web Apps with .NET 6.pptxEd Charbeneau
 
Developing Real-Time Data Pipelines with Apache Kafka
Developing Real-Time Data Pipelines with Apache KafkaDeveloping Real-Time Data Pipelines with Apache Kafka
Developing Real-Time Data Pipelines with Apache KafkaJoe Stein
 
Ratpack - SpringOne2GX 2015
Ratpack - SpringOne2GX 2015Ratpack - SpringOne2GX 2015
Ratpack - SpringOne2GX 2015Daniel Woods
 
Angular (v2 and up) - Morning to understand - Linagora
Angular (v2 and up) - Morning to understand - LinagoraAngular (v2 and up) - Morning to understand - Linagora
Angular (v2 and up) - Morning to understand - LinagoraLINAGORA
 
JDBC, What Is It Good For?
JDBC, What Is It Good For?JDBC, What Is It Good For?
JDBC, What Is It Good For?VMware Tanzu
 
Building .NET Microservices
Building .NET MicroservicesBuilding .NET Microservices
Building .NET MicroservicesVMware Tanzu
 
Welcome to the Reactive Revolution:RSocket and Spring Cloud Gateway - Spencer...
Welcome to the Reactive Revolution:RSocket and Spring Cloud Gateway - Spencer...Welcome to the Reactive Revolution:RSocket and Spring Cloud Gateway - Spencer...
Welcome to the Reactive Revolution:RSocket and Spring Cloud Gateway - Spencer...VMware Tanzu
 
Spring Boot 3 And Beyond
Spring Boot 3 And BeyondSpring Boot 3 And Beyond
Spring Boot 3 And BeyondVMware Tanzu
 
CISOA Conference 2020 Banner 9 Development
CISOA Conference 2020 Banner 9 DevelopmentCISOA Conference 2020 Banner 9 Development
CISOA Conference 2020 Banner 9 DevelopmentBrad Rippe
 
Connecting your .Net Applications to NoSQL Databases - MongoDB & Cassandra
Connecting your .Net Applications to NoSQL Databases - MongoDB & CassandraConnecting your .Net Applications to NoSQL Databases - MongoDB & Cassandra
Connecting your .Net Applications to NoSQL Databases - MongoDB & CassandraLohith Goudagere Nagaraj
 
Under the Hood of Reactive Data Access (2/2)
Under the Hood of Reactive Data Access (2/2)Under the Hood of Reactive Data Access (2/2)
Under the Hood of Reactive Data Access (2/2)VMware Tanzu
 
The New MariaDB Offering: MariaDB 10, MaxScale and More
The New MariaDB Offering: MariaDB 10, MaxScale and MoreThe New MariaDB Offering: MariaDB 10, MaxScale and More
The New MariaDB Offering: MariaDB 10, MaxScale and MoreMariaDB Corporation
 
Consumer Driven Contracts and Your Microservice Architecture
Consumer Driven Contracts and Your Microservice ArchitectureConsumer Driven Contracts and Your Microservice Architecture
Consumer Driven Contracts and Your Microservice ArchitectureVMware Tanzu
 
Client vs Server Templating: Speed up initial load for SPA with Angular as an...
Client vs Server Templating: Speed up initial load for SPA with Angular as an...Client vs Server Templating: Speed up initial load for SPA with Angular as an...
Client vs Server Templating: Speed up initial load for SPA with Angular as an...David Amend
 
Web Component Development Using Servlet & JSP Technologies (EE6) - Chapter 1...
 Web Component Development Using Servlet & JSP Technologies (EE6) - Chapter 1... Web Component Development Using Servlet & JSP Technologies (EE6) - Chapter 1...
Web Component Development Using Servlet & JSP Technologies (EE6) - Chapter 1...WebStackAcademy
 
The Future Is The Cloud
The Future Is The CloudThe Future Is The Cloud
The Future Is The CloudGatsbyjs
 
High performance stream processing
High performance stream processingHigh performance stream processing
High performance stream processingGlenn Renfro
 

Similar to Full Steam Ahead, R2DBC! (20)

Spring Update | July 2023
Spring Update | July 2023Spring Update | July 2023
Spring Update | July 2023
 
Modernizing Web Apps with .NET 6.pptx
Modernizing Web Apps with .NET 6.pptxModernizing Web Apps with .NET 6.pptx
Modernizing Web Apps with .NET 6.pptx
 
Modernizing Web Apps with .NET 6.pptx
Modernizing Web Apps with .NET 6.pptxModernizing Web Apps with .NET 6.pptx
Modernizing Web Apps with .NET 6.pptx
 
Reactive Web Applications
Reactive Web ApplicationsReactive Web Applications
Reactive Web Applications
 
Developing Real-Time Data Pipelines with Apache Kafka
Developing Real-Time Data Pipelines with Apache KafkaDeveloping Real-Time Data Pipelines with Apache Kafka
Developing Real-Time Data Pipelines with Apache Kafka
 
Ratpack - SpringOne2GX 2015
Ratpack - SpringOne2GX 2015Ratpack - SpringOne2GX 2015
Ratpack - SpringOne2GX 2015
 
Angular (v2 and up) - Morning to understand - Linagora
Angular (v2 and up) - Morning to understand - LinagoraAngular (v2 and up) - Morning to understand - Linagora
Angular (v2 and up) - Morning to understand - Linagora
 
JDBC, What Is It Good For?
JDBC, What Is It Good For?JDBC, What Is It Good For?
JDBC, What Is It Good For?
 
Building .NET Microservices
Building .NET MicroservicesBuilding .NET Microservices
Building .NET Microservices
 
Welcome to the Reactive Revolution:RSocket and Spring Cloud Gateway - Spencer...
Welcome to the Reactive Revolution:RSocket and Spring Cloud Gateway - Spencer...Welcome to the Reactive Revolution:RSocket and Spring Cloud Gateway - Spencer...
Welcome to the Reactive Revolution:RSocket and Spring Cloud Gateway - Spencer...
 
Spring Boot 3 And Beyond
Spring Boot 3 And BeyondSpring Boot 3 And Beyond
Spring Boot 3 And Beyond
 
CISOA Conference 2020 Banner 9 Development
CISOA Conference 2020 Banner 9 DevelopmentCISOA Conference 2020 Banner 9 Development
CISOA Conference 2020 Banner 9 Development
 
Connecting your .Net Applications to NoSQL Databases - MongoDB & Cassandra
Connecting your .Net Applications to NoSQL Databases - MongoDB & CassandraConnecting your .Net Applications to NoSQL Databases - MongoDB & Cassandra
Connecting your .Net Applications to NoSQL Databases - MongoDB & Cassandra
 
Under the Hood of Reactive Data Access (2/2)
Under the Hood of Reactive Data Access (2/2)Under the Hood of Reactive Data Access (2/2)
Under the Hood of Reactive Data Access (2/2)
 
The New MariaDB Offering: MariaDB 10, MaxScale and More
The New MariaDB Offering: MariaDB 10, MaxScale and MoreThe New MariaDB Offering: MariaDB 10, MaxScale and More
The New MariaDB Offering: MariaDB 10, MaxScale and More
 
Consumer Driven Contracts and Your Microservice Architecture
Consumer Driven Contracts and Your Microservice ArchitectureConsumer Driven Contracts and Your Microservice Architecture
Consumer Driven Contracts and Your Microservice Architecture
 
Client vs Server Templating: Speed up initial load for SPA with Angular as an...
Client vs Server Templating: Speed up initial load for SPA with Angular as an...Client vs Server Templating: Speed up initial load for SPA with Angular as an...
Client vs Server Templating: Speed up initial load for SPA with Angular as an...
 
Web Component Development Using Servlet & JSP Technologies (EE6) - Chapter 1...
 Web Component Development Using Servlet & JSP Technologies (EE6) - Chapter 1... Web Component Development Using Servlet & JSP Technologies (EE6) - Chapter 1...
Web Component Development Using Servlet & JSP Technologies (EE6) - Chapter 1...
 
The Future Is The Cloud
The Future Is The CloudThe Future Is The Cloud
The Future Is The Cloud
 
High performance stream processing
High performance stream processingHigh performance stream processing
High performance stream processing
 

More from VMware Tanzu

Spring into AI presented by Dan Vega 5/14
Spring into AI presented by Dan Vega 5/14Spring into AI presented by Dan Vega 5/14
Spring into AI presented by Dan Vega 5/14VMware Tanzu
 
What AI Means For Your Product Strategy And What To Do About It
What AI Means For Your Product Strategy And What To Do About ItWhat AI Means For Your Product Strategy And What To Do About It
What AI Means For Your Product Strategy And What To Do About ItVMware Tanzu
 
Make the Right Thing the Obvious Thing at Cardinal Health 2023
Make the Right Thing the Obvious Thing at Cardinal Health 2023Make the Right Thing the Obvious Thing at Cardinal Health 2023
Make the Right Thing the Obvious Thing at Cardinal Health 2023VMware Tanzu
 
Enhancing DevEx and Simplifying Operations at Scale
Enhancing DevEx and Simplifying Operations at ScaleEnhancing DevEx and Simplifying Operations at Scale
Enhancing DevEx and Simplifying Operations at ScaleVMware Tanzu
 
Platforms, Platform Engineering, & Platform as a Product
Platforms, Platform Engineering, & Platform as a ProductPlatforms, Platform Engineering, & Platform as a Product
Platforms, Platform Engineering, & Platform as a ProductVMware Tanzu
 
Building Cloud Ready Apps
Building Cloud Ready AppsBuilding Cloud Ready Apps
Building Cloud Ready AppsVMware Tanzu
 
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdfSpring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdfVMware Tanzu
 
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023VMware Tanzu
 
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023VMware Tanzu
 
tanzu_developer_connect.pptx
tanzu_developer_connect.pptxtanzu_developer_connect.pptx
tanzu_developer_connect.pptxVMware Tanzu
 
Tanzu Virtual Developer Connect Workshop - French
Tanzu Virtual Developer Connect Workshop - FrenchTanzu Virtual Developer Connect Workshop - French
Tanzu Virtual Developer Connect Workshop - FrenchVMware Tanzu
 
Tanzu Developer Connect Workshop - English
Tanzu Developer Connect Workshop - EnglishTanzu Developer Connect Workshop - English
Tanzu Developer Connect Workshop - EnglishVMware Tanzu
 
Virtual Developer Connect Workshop - English
Virtual Developer Connect Workshop - EnglishVirtual Developer Connect Workshop - English
Virtual Developer Connect Workshop - EnglishVMware Tanzu
 
Tanzu Developer Connect - French
Tanzu Developer Connect - FrenchTanzu Developer Connect - French
Tanzu Developer Connect - FrenchVMware Tanzu
 
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023VMware Tanzu
 
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring BootSpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring BootVMware Tanzu
 
SpringOne Tour: The Influential Software Engineer
SpringOne Tour: The Influential Software EngineerSpringOne Tour: The Influential Software Engineer
SpringOne Tour: The Influential Software EngineerVMware Tanzu
 
SpringOne Tour: Domain-Driven Design: Theory vs Practice
SpringOne Tour: Domain-Driven Design: Theory vs PracticeSpringOne Tour: Domain-Driven Design: Theory vs Practice
SpringOne Tour: Domain-Driven Design: Theory vs PracticeVMware Tanzu
 
SpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
SpringOne Tour: Spring Recipes: A Collection of Common-Sense SolutionsSpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
SpringOne Tour: Spring Recipes: A Collection of Common-Sense SolutionsVMware Tanzu
 
SpringOne Tour: Doing Progressive Delivery with your Team
SpringOne Tour: Doing Progressive Delivery with your TeamSpringOne Tour: Doing Progressive Delivery with your Team
SpringOne Tour: Doing Progressive Delivery with your TeamVMware Tanzu
 

More from VMware Tanzu (20)

Spring into AI presented by Dan Vega 5/14
Spring into AI presented by Dan Vega 5/14Spring into AI presented by Dan Vega 5/14
Spring into AI presented by Dan Vega 5/14
 
What AI Means For Your Product Strategy And What To Do About It
What AI Means For Your Product Strategy And What To Do About ItWhat AI Means For Your Product Strategy And What To Do About It
What AI Means For Your Product Strategy And What To Do About It
 
Make the Right Thing the Obvious Thing at Cardinal Health 2023
Make the Right Thing the Obvious Thing at Cardinal Health 2023Make the Right Thing the Obvious Thing at Cardinal Health 2023
Make the Right Thing the Obvious Thing at Cardinal Health 2023
 
Enhancing DevEx and Simplifying Operations at Scale
Enhancing DevEx and Simplifying Operations at ScaleEnhancing DevEx and Simplifying Operations at Scale
Enhancing DevEx and Simplifying Operations at Scale
 
Platforms, Platform Engineering, & Platform as a Product
Platforms, Platform Engineering, & Platform as a ProductPlatforms, Platform Engineering, & Platform as a Product
Platforms, Platform Engineering, & Platform as a Product
 
Building Cloud Ready Apps
Building Cloud Ready AppsBuilding Cloud Ready Apps
Building Cloud Ready Apps
 
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdfSpring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
 
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
 
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
 
tanzu_developer_connect.pptx
tanzu_developer_connect.pptxtanzu_developer_connect.pptx
tanzu_developer_connect.pptx
 
Tanzu Virtual Developer Connect Workshop - French
Tanzu Virtual Developer Connect Workshop - FrenchTanzu Virtual Developer Connect Workshop - French
Tanzu Virtual Developer Connect Workshop - French
 
Tanzu Developer Connect Workshop - English
Tanzu Developer Connect Workshop - EnglishTanzu Developer Connect Workshop - English
Tanzu Developer Connect Workshop - English
 
Virtual Developer Connect Workshop - English
Virtual Developer Connect Workshop - EnglishVirtual Developer Connect Workshop - English
Virtual Developer Connect Workshop - English
 
Tanzu Developer Connect - French
Tanzu Developer Connect - FrenchTanzu Developer Connect - French
Tanzu Developer Connect - French
 
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
 
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring BootSpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
 
SpringOne Tour: The Influential Software Engineer
SpringOne Tour: The Influential Software EngineerSpringOne Tour: The Influential Software Engineer
SpringOne Tour: The Influential Software Engineer
 
SpringOne Tour: Domain-Driven Design: Theory vs Practice
SpringOne Tour: Domain-Driven Design: Theory vs PracticeSpringOne Tour: Domain-Driven Design: Theory vs Practice
SpringOne Tour: Domain-Driven Design: Theory vs Practice
 
SpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
SpringOne Tour: Spring Recipes: A Collection of Common-Sense SolutionsSpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
SpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
 
SpringOne Tour: Doing Progressive Delivery with your Team
SpringOne Tour: Doing Progressive Delivery with your TeamSpringOne Tour: Doing Progressive Delivery with your Team
SpringOne Tour: Doing Progressive Delivery with your Team
 

Recently uploaded

Facemoji Keyboard released its 2023 State of Emoji report, outlining the most...
Facemoji Keyboard released its 2023 State of Emoji report, outlining the most...Facemoji Keyboard released its 2023 State of Emoji report, outlining the most...
Facemoji Keyboard released its 2023 State of Emoji report, outlining the most...rajkumar669520
 
Mastering Windows 7 A Comprehensive Guide for Power Users .pdf
Mastering Windows 7 A Comprehensive Guide for Power Users .pdfMastering Windows 7 A Comprehensive Guide for Power Users .pdf
Mastering Windows 7 A Comprehensive Guide for Power Users .pdfmbmh111980
 
Studiovity film pre-production and screenwriting software
Studiovity film pre-production and screenwriting softwareStudiovity film pre-production and screenwriting software
Studiovity film pre-production and screenwriting softwareinfo611746
 
AI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAG
AI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAGAI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAG
AI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAGAlluxio, Inc.
 
A Comprehensive Appium Guide for Hybrid App Automation Testing.pdf
A Comprehensive Appium Guide for Hybrid App Automation Testing.pdfA Comprehensive Appium Guide for Hybrid App Automation Testing.pdf
A Comprehensive Appium Guide for Hybrid App Automation Testing.pdfkalichargn70th171
 
Breaking the Code : A Guide to WhatsApp Business API.pdf
Breaking the Code : A Guide to WhatsApp Business API.pdfBreaking the Code : A Guide to WhatsApp Business API.pdf
Breaking the Code : A Guide to WhatsApp Business API.pdfMeon Technology
 
StrimziCon 2024 - Transition to Apache Kafka on Kubernetes with Strimzi
StrimziCon 2024 - Transition to Apache Kafka on Kubernetes with StrimziStrimziCon 2024 - Transition to Apache Kafka on Kubernetes with Strimzi
StrimziCon 2024 - Transition to Apache Kafka on Kubernetes with Strimzisteffenkarlsson2
 
Crafting the Perfect Measurement Sheet with PLM Integration
Crafting the Perfect Measurement Sheet with PLM IntegrationCrafting the Perfect Measurement Sheet with PLM Integration
Crafting the Perfect Measurement Sheet with PLM IntegrationWave PLM
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2
 
Into the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdfInto the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdfOrtus Solutions, Corp
 
Designing for Privacy in Amazon Web Services
Designing for Privacy in Amazon Web ServicesDesigning for Privacy in Amazon Web Services
Designing for Privacy in Amazon Web ServicesKrzysztofKkol1
 
INGKA DIGITAL: Linked Metadata by Design
INGKA DIGITAL: Linked Metadata by DesignINGKA DIGITAL: Linked Metadata by Design
INGKA DIGITAL: Linked Metadata by DesignNeo4j
 
KLARNA - Language Models and Knowledge Graphs: A Systems Approach
KLARNA -  Language Models and Knowledge Graphs: A Systems ApproachKLARNA -  Language Models and Knowledge Graphs: A Systems Approach
KLARNA - Language Models and Knowledge Graphs: A Systems ApproachNeo4j
 
AI/ML Infra Meetup | ML explainability in Michelangelo
AI/ML Infra Meetup | ML explainability in MichelangeloAI/ML Infra Meetup | ML explainability in Michelangelo
AI/ML Infra Meetup | ML explainability in MichelangeloAlluxio, Inc.
 
Benefits of Employee Monitoring Software
Benefits of  Employee Monitoring SoftwareBenefits of  Employee Monitoring Software
Benefits of Employee Monitoring SoftwareMera Monitor
 
SOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBrokerSOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBrokerSOCRadar
 
A Guideline to Zendesk to Re:amaze Data Migration
A Guideline to Zendesk to Re:amaze Data MigrationA Guideline to Zendesk to Re:amaze Data Migration
A Guideline to Zendesk to Re:amaze Data MigrationHelp Desk Migration
 
Advanced Flow Concepts Every Developer Should Know
Advanced Flow Concepts Every Developer Should KnowAdvanced Flow Concepts Every Developer Should Know
Advanced Flow Concepts Every Developer Should KnowPeter Caitens
 

Recently uploaded (20)

Facemoji Keyboard released its 2023 State of Emoji report, outlining the most...
Facemoji Keyboard released its 2023 State of Emoji report, outlining the most...Facemoji Keyboard released its 2023 State of Emoji report, outlining the most...
Facemoji Keyboard released its 2023 State of Emoji report, outlining the most...
 
Mastering Windows 7 A Comprehensive Guide for Power Users .pdf
Mastering Windows 7 A Comprehensive Guide for Power Users .pdfMastering Windows 7 A Comprehensive Guide for Power Users .pdf
Mastering Windows 7 A Comprehensive Guide for Power Users .pdf
 
Studiovity film pre-production and screenwriting software
Studiovity film pre-production and screenwriting softwareStudiovity film pre-production and screenwriting software
Studiovity film pre-production and screenwriting software
 
AI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAG
AI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAGAI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAG
AI/ML Infra Meetup | Reducing Prefill for LLM Serving in RAG
 
A Comprehensive Appium Guide for Hybrid App Automation Testing.pdf
A Comprehensive Appium Guide for Hybrid App Automation Testing.pdfA Comprehensive Appium Guide for Hybrid App Automation Testing.pdf
A Comprehensive Appium Guide for Hybrid App Automation Testing.pdf
 
Breaking the Code : A Guide to WhatsApp Business API.pdf
Breaking the Code : A Guide to WhatsApp Business API.pdfBreaking the Code : A Guide to WhatsApp Business API.pdf
Breaking the Code : A Guide to WhatsApp Business API.pdf
 
StrimziCon 2024 - Transition to Apache Kafka on Kubernetes with Strimzi
StrimziCon 2024 - Transition to Apache Kafka on Kubernetes with StrimziStrimziCon 2024 - Transition to Apache Kafka on Kubernetes with Strimzi
StrimziCon 2024 - Transition to Apache Kafka on Kubernetes with Strimzi
 
Crafting the Perfect Measurement Sheet with PLM Integration
Crafting the Perfect Measurement Sheet with PLM IntegrationCrafting the Perfect Measurement Sheet with PLM Integration
Crafting the Perfect Measurement Sheet with PLM Integration
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
Into the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdfInto the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdf
 
Corporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMSCorporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMS
 
Designing for Privacy in Amazon Web Services
Designing for Privacy in Amazon Web ServicesDesigning for Privacy in Amazon Web Services
Designing for Privacy in Amazon Web Services
 
INGKA DIGITAL: Linked Metadata by Design
INGKA DIGITAL: Linked Metadata by DesignINGKA DIGITAL: Linked Metadata by Design
INGKA DIGITAL: Linked Metadata by Design
 
Top Mobile App Development Companies 2024
Top Mobile App Development Companies 2024Top Mobile App Development Companies 2024
Top Mobile App Development Companies 2024
 
KLARNA - Language Models and Knowledge Graphs: A Systems Approach
KLARNA -  Language Models and Knowledge Graphs: A Systems ApproachKLARNA -  Language Models and Knowledge Graphs: A Systems Approach
KLARNA - Language Models and Knowledge Graphs: A Systems Approach
 
AI/ML Infra Meetup | ML explainability in Michelangelo
AI/ML Infra Meetup | ML explainability in MichelangeloAI/ML Infra Meetup | ML explainability in Michelangelo
AI/ML Infra Meetup | ML explainability in Michelangelo
 
Benefits of Employee Monitoring Software
Benefits of  Employee Monitoring SoftwareBenefits of  Employee Monitoring Software
Benefits of Employee Monitoring Software
 
SOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBrokerSOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBroker
 
A Guideline to Zendesk to Re:amaze Data Migration
A Guideline to Zendesk to Re:amaze Data MigrationA Guideline to Zendesk to Re:amaze Data Migration
A Guideline to Zendesk to Re:amaze Data Migration
 
Advanced Flow Concepts Every Developer Should Know
Advanced Flow Concepts Every Developer Should KnowAdvanced Flow Concepts Every Developer Should Know
Advanced Flow Concepts Every Developer Should Know
 

Full Steam Ahead, R2DBC!

  • 1. Full Steam Ahead! Mark Paluch • Spring Data Project Lead, R2DBC Contributor • @mp911de
  • 3. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Mark Paluch ● Spring Data, R2DBC, Lettuce Redis Driver ● All things non-blocking ● @mp911de (Twitter, GitHub) 3
  • 4. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 4 2009 Microsoft to release .NET 4.0 2013 Reactive Manifesto Initial Akka release 2014 RxJava 1.0 2015 Reactive Streams 1.0 Project Reactor 2.0 2016 RxJava 2.0 Akka Streams 1.0 Ratpack Spring WebFlux Micronaut Today RSocket Reactive Mongo Lettuce Cassandra vert.x Lagom Apple Servicetalk Helidon RxJava 3.0 Project Reactor 3.0
  • 5. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Programming Models Have Changed ● Reactive applications typically stream-processing ● Push-based models ● Notifications, Events ● Is SQL the right choice for reactive applications? ● Depends on the Use-Case 5
  • 6. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Programming ● High-efficiency applications ● Fundamentally non-blocking ● No opinion on async ● Key differentiators: (pull-push) back pressure, flow control 6
  • 7. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Persistence ● ✅ Kafka ● ✅ MongoDB ● ✅ Cassandra ● ✅ Couchbase ● ✅ Redis ● ❌ Oracle, DB2, MySQL, MariaDB, Postgres, SQL Server* 7
  • 8. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Persistence ● ✅ Kafka ● ✅ MongoDB ● ✅ Cassandra ● ✅ Couchbase ● ✅ Redis ● ❌ Oracle, DB2, MySQL, MariaDB, Postgres, SQL Server* 8
  • 9. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Non-blocking SQL Persistence (1/3) ● MySQL: X DevAPI (Document Store API): CompletableFuture ● vert.x Postgres Driver: Callback API ● jasync-sql: CompletableFuture ● Common API 🤕 9
  • 10. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Non-blocking SQL Persistence (2/3) ● JDBC on ThreadPool ● RxJava JDBC ● Blocks still threads ● Project Loom: Production readiness unknown ● Requires proper queuing and capacity controls 10
  • 11. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Non-blocking SQL Persistence (3/3) ● ADBA (Asynchronous Database API) ● Standard-API ● Based heavily on CompletableFuture ● Discontinued in favor of Project Loom 11
  • 12. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 12 Standard API for reactive programming with SQL databases on the JVM
  • 13. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Project of
  • 14. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Design Principles ● Embrace Reactive Types and Patterns ● Low barrier to entry (depends on Reactive Streams and Java 8 only) ● Non-blocking, all the way to the database ● De-duplicate driver efforts ● Documented specification ● Shrink the driver SPI ● Enable multiple "humane" APIs 14
  • 15. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Simple Select 15 Publisher<String> values = connectionFactory.create() .flatMapMany(conn -> conn.createStatement("SELECT value FROM test") .execute() .flatMap(result -> result.map((row, metadata) -> row.get("value", String.class))))
  • 16. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ R2DBC 0.8 ● Stable release ● End-to-end reactive non-blocking database communication ● Batching ● BLOB/CLOB ● Extensive Type Conversion ● Savepoints ● Transactions ● Leveraging Database-specific features ● ServiceLoader-based Driver discovery ● Connection URLs ● Categorized exceptions (Bad grammar, Data integrity violation, …) 16
  • 17. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ R2DBC 0.9 / 1.0 ● Evolution of the specification ● Extended transaction spec ● Improved In/Out Parameter Bindings ● Investigation on stored procedures ● No real demand so far ● Scheduled for 2021 17
  • 18. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ R2DBC Ecosystem ● Specification document ● R2DBC SPI ● R2DBC Proxy ● Connection Pooling ● Client Implementations ● Spring ● Querydsl ● R2DBC Migrate ● Kotysa ● Testcontainers ● Driver Community ● Google Cloud Spanner ● H2 ● Microsoft SQL Server ● MySQL Driver (r2dbc-mysql, jasync-sql) ● MariaDB ● PostgreSQL ● SAP Hana ● Oracle (work in progress) ● DB2 (work in progress) 18
  • 19. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Community Projects ● Specification document ● R2DBC SPI ● R2DBC Proxy ● Connection Pooling ● Client Implementations ● Spring ● Querydsl ● R2DBC Migrate ● Kotysa ● Testcontainers ● Driver Community ● Google Cloud Spanner ● H2 ● Microsoft SQL Server ● MySQL Driver (r2dbc-mysql, jasync-sql) ● MariaDB ● PostgreSQL ● SAP Hana ● Oracle (work in progress) ● DB2 (work in progress) 19
  • 20. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ R2DBC Clients: Work in Progress ● MyBatis (#1444) ● JDBI (#1454) ● jOOQ (#6298) ● Querydsl (#2468) ● Liquibase (CORE-3419) ● Flyway (#2502) ● Exposed (#456) ● Micronaut (#416) ● Go vote for a client you want to see happen. 20
  • 21. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ What R2DBC gives you ● Move Thread congestion out of JVM ● Achieve more with less Threads ● Doesn’t change law of physics ● Follow well-known SQL database interaction patterns ● Database laws still apply ● Obey wire protocol rules ● ACID rules 21
  • 22. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring ❤ R2DBC
  • 23. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring and R2DBC ● 2018/2019 ● First steps with Spring Data R2DBC 1.0 ● 2020 ● Migration of core R2DBC support from Spring Data to Spring Framework 5.3 ● Deprecations in Spring Data R2DBC 1.2 23
  • 24. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring R2DBC ● Central class: DatabaseClient ● BindMarker SPI ● Reactive Transaction Manager ● Schema initialization support ● ConnectionFactory implementations (e.g. AbstractRoutingConnectionFactory) 24
  • 25. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ DatabaseClient DatabaseClient client = DatabaseClient.create(connectionFactory); Flux<Person> people = client .sql("SELECT firstname, lastname FROM person WHERE age > :age") .bind("age", 42) .filter(statement -> statement.fetchSize(20)) .map(row -> new Person(row.get("firstname", String.class), row.get("lastname", String.class))) .all(); 25
  • 26. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ConnectionFactoryInitializer @Bean ConnectionFactoryInitializer initializer(ConnectionFactory connectionFactory) { ConnectionFactoryInitializer initializer = new ConnectionFactoryInitializer(); initializer.setConnectionFactory(connectionFactory); initializer.setDatabasePopulator(new ResourceDatabasePopulator( new ClassPathResource("schema.sql"))); return initializer; } 26
  • 27. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring Data R2DBC ● Mapped entity support through R2dbcEntityOperations ● Query and Update objects ● Dialect-awareness ● Repository abstraction ● Sorry, no mapped relations yet 27
  • 28. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ R2dbcEntityTemplate R2dbcEntityTemplate entityTemplate = …; Flux<Person> people = entityTemplate.select(Person.class) .from("people") .matching(query(where("age").greaterThan(42)) .limit(10) .offset(20) .sort(by("firstname"))) .all(); 28
  • 29. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ R2dbcEntityTemplate R2dbcEntityTemplate entityTemplate = …; Flux<Person> people = entityTemplate.select(Person.class) .from("people") .matching(query(where("age").greaterThan(42)) .limit(10) .offset(20) .sort(by("firstname"))) .all(); 29 query(where("age").greaterThan(42)) .limit(10) .offset(20) .sort(by("firstname"))
  • 30. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Repositories interface PersonRepository extends ReactiveSortingRepository<Person, Integer> { Flux<Person> findByFirstnameContains(String name); Flux<Person> findFirst10By(); Flux<Person> findAllByOrderByLastname(Pageable pageable); @Modifying @Query("DELETE FROM person WHERE age = :age") Mono<Void> deleteAllByAge(int age); @Modifying @Query("DELETE FROM person") Mono<Integer> deleteAllAndReturnCount(); } 30
  • 31. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring Data R2DBC 1.2: New and Noteworthy ● Entity Callbacks ● Before/After Convert, Before/After Save ● Auditing ● SpEL Context Extensions ● Enum value revision ● Repository metrics SPI 31
  • 32. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Entity Callbacks @FunctionalInterface interface BeforeConvertCallback<T> extends EntityCallback<T> { Publisher<T> onBeforeConvert(T entity, SqlIdentifier table); } 32
  • 33. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Entity Callback in Action @Bean BeforeConvertCallback<Person> autogeneratedId(DatabaseClient client) { return (entity, table) -> { if (entity.getId() == null) { return client.sql("SELECT nextval('person_seq')") .map(row -> row.get(0, Integer.class)) .first() .map(entity::withId); } return Mono.just(entity); }; } 33
  • 34. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Outlook: Spring Data R2DBC 2.0 ● Closer alignment of Spring Data JDBC and Spring Data R2DBC ● Evolution of Spring Data Relational 34
  • 36. Unless otherwise indicated, these slides are © 2013-2020 vmware and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Resources ● Website https://r2dbc.io ● Twitter @r2dbc ● GitHub https://github.com/r2dbc ● Mailing List https://groups.google.com/forum/ #!forum/r2dbc ● Monthly Call 1st Friday of Month 0630 PT/0930 ET/1530 CET 36