reactive data acces with rxjava, including n1ql: couchbase connect 2015

49
REACTIVE DATA ACCESS WITH RXJAVA … INCLUDING N1QL! Michael Nitschinger, Couchbase @daschl

Upload: couchbase

Post on 11-Aug-2015

132 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

REACTIVE DATA ACCESS WITH RXJAVA… INCLUDING N1QL!

Michael Nitschinger, Couchbase@daschl

Page 2: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 2

New challenges React to user load React to failure Be responsive under load and failure

Need new solutions Decoupled, event-driven architectures Optimal resource utilization

Why Reactive?

2

Page 3: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 3

Why Reactive?

3

Page 4: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 4

Detour: Async Java Client Stack

4

Page 5: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 5

Detour: Smart Batching

Source: http://mechanical-sympathy.blogspot.co.at/2011/10/smart-batching.html5

Page 6: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 6

Detour: Smart Batching

Source: http://mechanical-sympathy.blogspot.co.at/2011/10/smart-batching.html6

Page 7: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

RxJava 101A Gentle Introduction

Page 8: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 8

Java implementation for Reactive Extensions https://github.com/ReactiveX

A library to compose asynchronous and event-driven programs through observable sequences.

RxJava: Introduction

single multiple

sync T Iterable<T>

async

Future<T>

Observable<T>

8

Page 9: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 9

Observables are the duals of Iterables They describe both Latency and Error side

effects.

RxJava: Introduction

event Iterable<T> (pull) Observable<T> (push)

data retrieval

T next() onNext(T)

error discovery

throws Exception onError(Exception)

completion returns onCompleted()

9

Page 10: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 10

Consuming Observables

10

The Observer subscribes and receives events.

A cold Observablestarts when subscribed.

onNext can be called0..N times

Page 11: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 11

RxJava: Creating Observables

just

11

Page 12: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 12

RxJava: Creating Observables

12

Page 13: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 13

RxJava: Creating Observables

13

Page 14: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 14

RxJava: Creating Observables

14

Page 15: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 15

RxJava: Creating Observables

15

Page 16: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 16

RxJava: Creating Observables

16

Page 17: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 17

RxJava: Transforming Observables

17

Page 18: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 18

RxJava: Transforming Observables

18

Page 19: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 19

RxJava: Transforming Observables

19

Page 20: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 20

RxJava: Transforming Observables

20

Page 21: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 21

RxJava: Transforming Observables

21

Page 22: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 22

RxJava: Transforming Observables

22

Page 23: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 23

RxJava: Transforming Observables

23

Page 24: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 24

RxJava: Transforming Observables

24

Page 25: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 25

RxJava: Transforming Observables

25

Page 26: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 26

RxJava: Filtering Observables

26

Page 27: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 27

RxJava: Filtering Observables

27

Page 28: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 28

RxJava: Filtering Observables

28

Page 29: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 29

RxJava: Filtering Observables

29

Page 30: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

Reactive N1QLCranking Queries up to Eleven!

Page 31: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 31

Simple Executes a single N1QL statement, no options available.

Parameterized Executes a parameterized query with positional or

named params

Prepared Executed a previously prepared statement

Query Types

31

Page 32: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 32

(Async) QueryResult Observable<AsyncQueryRow> rows() Observable<JsonObject> errors() Observable<QueryMetrics> info() Observable<Object> signature() Observable<Boolean> finalSuccess() boolean parseSuccess() String requestId() String clientContextId()

Query Response

32

Page 33: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 33

Simple Query

33

Page 34: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 34

Parameterized Query

34

Named Params

Page 35: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 35

Parametrized Query

35

Positional Params

Page 36: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 36

Prepared Query

36

Page 37: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 37

Index Handling

37

Page 38: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 38

Index Handling

38

Page 39: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 39

Conditional Index Creation

39

Page 40: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

Error Handlingwith RxJava

Page 41: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 41

Things will go wrong, so better plan for it Do not trust integration points (including the

SDK) Synchronous retry & fallback is too damn hard

RxJava provides (almost) everything you need to fallback retry fail fast

Preparing to Fail

41

Page 42: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 42

Timeouts

42

The network is unreliable Servers fail The SDK contains bugs

Always specify timeouts and deal with them! The synchronous wrapper defines them for you all

the time.

Page 43: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 43

Timeouts: Simple

43

Page 44: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 44

Timeouts: Synchronous API

44

Page 45: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 45

Timeouts: Complex Example

45

Page 46: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 46

Coordinated Retry

46

Fail fast Don’t let your system get stuck Shed load with backpressure

Retry immediately won’t help either linear or exponential back-off necessary have a strategy if retry also doesn’t work (Fallbacks!)

Page 47: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 47

Coordinated Fallback

47

Page 48: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

©2015 Couchbase Inc. 48

Coordinated Retry: Builder

48

Declarative API instead of complicated retryWhen

Page 49: Reactive Data Acces with RxJava, Including N1QL: Couchbase Connect 2015

Thank you.