Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Reactive Data Access with RxJava ... and N1QL!

Reactive Data Access with RxJava ... and N1QL!

I gave this talk at Couchbase Connect 2015 in Santa Clara. Check out the couchbase website for the recording!

Michael Nitschinger

June 03, 2015
Tweet

More Decks by Michael Nitschinger

Other Decks in Programming

Transcript

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

    View full-size slide

  2. ©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  

    View full-size slide

  3. ©2015  Couchbase  Inc.   3  
    Why  Reactive?  
    3  

    View full-size slide

  4. ©2015  Couchbase  Inc.   4  
    Detour:  Async  Java  Client  Stack  
    4  

    View full-size slide

  5. ©2015  Couchbase  Inc.   5  
     
    Detour:  Smart  Batching  
    Source:  http://mechanical-­‐sympathy.blogspot.co.at/2011/10/smart-­‐batching.html  
    5  

    View full-size slide

  6. ©2015  Couchbase  Inc.   6  
     
    Detour:  Smart  Batching  
    Source:  http://mechanical-­‐sympathy.blogspot.co.at/2011/10/smart-­‐batching.html  
    6  

    View full-size slide

  7. RxJava  101  
    A  Gentle  Introduction  

    View full-size slide

  8. ©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  
    async   Future   Observable  
    8  

    View full-size slide

  9. ©2015  Couchbase  Inc.   9  
    §  Observables  are  the  duals  of  Iterables  
    §  They  describe  both  Latency  and  Error  side  effects.  
    RxJava:  Introduction  
    event   Iterable  (pull)   Observable  (push)  
    data  retrieval   T  next()   onNext(T)  
    error  discovery   throws  Exception   onError(Exception)  
    completion   returns   onCompleted()  
    9  

    View full-size slide

  10. ©2015  Couchbase  Inc.   10  
    Consuming  Observables  
    10  
    §  The  Observer  subscribes    
    and  receives  events.  
    §  A  cold  Observable  
    starts  when  subscribed.  
    §  onNext  can  be  called  
    0..N  times  

    View full-size slide

  11. ©2015  Couchbase  Inc.   11  
    RxJava:  Creating  Observables  
    just
    11  

    View full-size slide

  12. ©2015  Couchbase  Inc.   12  
    RxJava:  Creating  Observables  
    12  

    View full-size slide

  13. ©2015  Couchbase  Inc.   13  
    RxJava:  Creating  Observables  
    13  

    View full-size slide

  14. ©2015  Couchbase  Inc.   14  
    RxJava:  Creating  Observables  
    14  

    View full-size slide

  15. ©2015  Couchbase  Inc.   15  
    RxJava:  Creating  Observables  
    15  

    View full-size slide

  16. ©2015  Couchbase  Inc.   16  
    RxJava:  Creating  Observables  
    16  

    View full-size slide

  17. ©2015  Couchbase  Inc.   17  
    RxJava:  Transforming  Observables  
    17  

    View full-size slide

  18. ©2015  Couchbase  Inc.   18  
    RxJava:  Transforming  Observables  
    18  

    View full-size slide

  19. ©2015  Couchbase  Inc.   19  
    RxJava:  Transforming  Observables  
    19  

    View full-size slide

  20. ©2015  Couchbase  Inc.   20  
    RxJava:  Transforming  Observables  
    20  

    View full-size slide

  21. ©2015  Couchbase  Inc.   21  
    RxJava:  Transforming  Observables  
    21  

    View full-size slide

  22. ©2015  Couchbase  Inc.   22  
    RxJava:  Transforming  Observables  
    22  

    View full-size slide

  23. ©2015  Couchbase  Inc.   23  
    RxJava:  Transforming  Observables  
    23  

    View full-size slide

  24. ©2015  Couchbase  Inc.   24  
    RxJava:  Transforming  Observables  
    24  

    View full-size slide

  25. ©2015  Couchbase  Inc.   25  
    RxJava:  Transforming  Observables  
    25  

    View full-size slide

  26. ©2015  Couchbase  Inc.   26  
    RxJava:  Filtering  Observables  
    26  

    View full-size slide

  27. ©2015  Couchbase  Inc.   27  
    RxJava:  Filtering  Observables  
    27  

    View full-size slide

  28. ©2015  Couchbase  Inc.   28  
    RxJava:  Filtering  Observables  
    28  

    View full-size slide

  29. ©2015  Couchbase  Inc.   29  
    RxJava:  Filtering  Observables  
    29  

    View full-size slide

  30. Reactive  N1QL  
    Cranking  Queries  up  to  Eleven!  

    View full-size slide

  31. ©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  

    View full-size slide

  32. ©2015  Couchbase  Inc.   32  
    § (Async)  QueryResult  
    §  Observable  rows()  
    §  Observable  errors()  
    §  Observable  info()  
    §  Observable  signature()  
    §  Observable  finalSuccess()  
    §  boolean  parseSuccess()  
    §  String  requestId()  
    §  String  clientContextId()  
    Query  Response  
    32  

    View full-size slide

  33. ©2015  Couchbase  Inc.   33  
    Simple  Query  
    33  

    View full-size slide

  34. ©2015  Couchbase  Inc.   34  
    Parameterized  Query  
    34  
    § Named  Params  

    View full-size slide

  35. ©2015  Couchbase  Inc.   35  
    Parametrized  Query  
    35  
    § Positional  Params  

    View full-size slide

  36. ©2015  Couchbase  Inc.   36  
    Prepared  Query  
    36  

    View full-size slide

  37. ©2015  Couchbase  Inc.   37  
    Index  Handling  
    37  

    View full-size slide

  38. ©2015  Couchbase  Inc.   38  
    Index  Handling  
    38  

    View full-size slide

  39. ©2015  Couchbase  Inc.   39  
    Conditional  Index  Creation  
    39  

    View full-size slide

  40. Error  Handling  
    with  RxJava  

    View full-size slide

  41. ©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  

    View full-size slide

  42. ©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.  

    View full-size slide

  43. ©2015  Couchbase  Inc.   43  
    Timeouts:  Simple  
    43  

    View full-size slide

  44. ©2015  Couchbase  Inc.   44  
    Timeouts:  Synchronous  API  
    44  

    View full-size slide

  45. ©2015  Couchbase  Inc.   45  
    Timeouts:  Complex  Example  
    45  

    View full-size slide

  46. ©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!)    

    View full-size slide

  47. ©2015  Couchbase  Inc.   47  
    Coordinated  Fallback  
    47  

    View full-size slide

  48. ©2015  Couchbase  Inc.   48  
    Coordinated  Retry:  Builder  
    48  
    §  Declarative  API  instead  of  complicated  retryWhen  

    View full-size slide

  49. Thank  you.  

    View full-size slide