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

Rethinking Reactive Architectures

Rethinking Reactive Architectures

NDC Oslo 2021
Video: https://youtu.be/L1Zgfr6bFvA

SQUER Solutions

December 02, 2021
Tweet

More Decks by SQUER Solutions

Other Decks in Technology

Transcript

  1. “ streams are just another data structure. @duffleit Time Space

    Value Getter Setter Collections Iterators Generators Promise Deferred Resolver Stream Subscriber Emitter
  2. @duffleit What has this to do with reactivity? 🤔 “

    Programming with, or designing upon, asynchronous data streams.
  3. @duffleit var counter = 2; var doubled = counter *

    2; assert(doubled, 4); 1 2 3 4 ✅
  4. @duffleit var counter = 2; var doubled = counter *

    2; // updating the counter counter = 3; 1 2 3 4 5
  5. @duffleit var counter = 2; var doubled = counter *

    2; // updating the counter counter = 3; assert(doubled, 6) 1 2 3 4 5 6 7 💔
  6. @duffleit var counter = 2; var doubled = counter *

    2; // updating the counter counter = 3; doubled = counter * 2; 1 2 3 4 5 6
  7. @duffleit var counter = 2; var doubled = counter *

    2; // updating the counter counter = 3; doubled = counter * 2; assert(doubled, 6) 1 2 3 4 5 6 7 8
  8. @duffleit var counter = 2; var doubled = counter *

    2; // updating the counter counter = 3; doubled = counter * 2; assert(doubled, 6) 1 2 3 4 5 6 7 8 ✅ doubled 🔗 counter paulstovell.com/reactive-programming/
  9. @duffleit var counter = 2; var doubled <= counter *

    2; 1 2 doubled 🔗 counter 👆
  10. @duffleit var counter = 2; var doubled <= counter *

    2; // updating the counter counter = 3; 1 2 3 4 5 doubled 🔗 counter
  11. @duffleit var counter = 2; var doubled <= counter *

    2; // updating the counter counter = 3; assert(doubled, 6) 1 2 3 4 5 6 7 doubled 🔗 counter ✅
  12. @duffleit var counter = stream(2); var doubled = counter.map(x ->

    x * 2) 1 2 🔗 = streams 👆 counter: [2]
  13. @duffleit var counter = stream(2); var doubled = counter.map(x ->

    x * 2) 1 2 👆 counter: [2] doubled: [4]
  14. @duffleit var counter = stream(2); var doubled = counter.map(x ->

    x * 2) 1 2 “ we project the data from our counter stream into our doubled stream. 👆 counter: [2] doubled: [4]
  15. @duffleit var counter = stream(2); var doubled = counter.map(x ->

    x * 2) // updating the counter 1 2 3 4 👈 counter: [2] doubled: [4]
  16. @duffleit var counter = stream(2); var doubled = counter.map(x ->

    x * 2) // updating the counter counter.emit(3); 1 2 3 4 5 👈 counter: [2] doubled: [4]
  17. @duffleit var counter = stream(2); var doubled = counter.map(x ->

    x * 2) // updating the counter counter.emit(3); 1 2 3 4 5 counter: [2, 3] doubled: [4] 👈
  18. @duffleit var counter = stream(2); var doubled = counter.map(x ->

    x * 2) // updating the counter counter.emit(3); 1 2 3 4 5 counter: [2, 3] doubled: [4, 6] 👈
  19. @duffleit var counter = stream(2); var doubled = counter.map(x ->

    x * 2) // updating the counter counter.emit(3); assert(doubled.value, 6) 1 2 3 4 5 6 7 👈 counter: [2, 3] doubled: [4, 6] ✅
  20. @duffleit var counter = new BehaviorSubject<number>(2); var doubled = counter.pipe(map(x

    -> x * 2)); // updating the counter counter.emit(3); 1 2 3 4 5 👈
  21. @duffleit var counter = new BehaviorSubject<number>(2); var doubled = counter.pipe(map(x

    -> x * 2)); // updating the counter counter.emit(3); assert(doubled.value, 6); 1 2 3 4 5 6 7 👈 ✅
  22. @duffleit var counter = 2; $: doubled = counter *

    2; // updating the counter counter = 3; 1 2 3 4 5 👈
  23. @duffleit var counter = 2; $: doubled = counter *

    2; // updating the counter counter = 3; assert(doubled, 6); 1 2 3 4 5 6 7 👈 ✅
  24. @duffleit We can apply those Concepts of Reactive Programming on

    Architecture as well. * and hope they still make sense.
  25. @duffleit User <μService> Account <μService> Legder <μService> WebBanking New Payment

    💸 Perform Payment € 20, 00 👧 Lisa to David from transferMoney triggerPayment createTransactions
  26. @duffleit User <μService> Account <μService> Legder <μService> WebBanking Your payment

    was successfully executed. transferMoney triggerPayment createTransactions ✅
  27. @duffleit User <μService> Account <μService> Legder <μService> WebBanking New Payment

    💸 Perform Payment € 20, 00 👧 Lisa to David from transferMoney triggerPayment createTransactions <μService> Legder Legder <μService>
  28. @duffleit User <μService> Account <μService> Legder <μService> WebBanking Your payment

    was successfully executed. transferMoney triggerPayment createTransactions ✅ Retries Timeouts Circuit Breakers Synchronise
  29. @duffleit User <μService> Account <μService> WebBanking transferMoney triggerPayment New Payment

    💸 € 20, 00 👧 Lisa to David from Perform Payment <μService> Legder
  30. @duffleit User <μService> Account <μService> WebBanking transferMoney triggerPayment New Payment

    💸 € 20, 00 👧 Lisa to David from Perform Payment <μService> Legder
  31. @duffleit User <μService> Account <μService> WebBanking transferMoney triggerPayment createTransactions New

    Payment 💸 € 20, 00 👧 Lisa to David from Perform Payment Queue <μService> Legder
  32. @duffleit User <μService> Account <μService> WebBanking transferMoney triggerPayment createTransactions New

    Payment 💸 € 20, 00 👧 Lisa to David from Perform Payment Queue <μService> Legder
  33. @duffleit User <μService> Account <μService> WebBanking transferMoney triggerPayment createTransactions New

    Payment 💸 € 20, 00 👧 Lisa to David from Perform Payment Queue <μService> Legder
  34. @duffleit User <μService> Account <μService> WebBanking transferMoney triggerPayment createTransactions New

    Payment 💸 € 20, 00 👧 Lisa to David from Perform Payment Queue <μService> Legder
  35. @duffleit User <μService> Account <μService> WebBanking transferMoney triggerPayment createTransactions New

    Payment 💸 € 20, 00 👧 Lisa to David from Perform Payment Queue <μService> Legder
  36. @duffleit User <μService> Account <μService> WebBanking transferMoney triggerPayment createTransactions Queue

    <μService> Legder Your payment was accepted. ✅ Legder <μService> Queue
  37. @duffleit User <μService> Account <μService> WebBanking transferMoney triggerPayment createTransactions Queue

    <μService> Legder Your payment was accepted. ✅ Legder <μService> Queue Queue
  38. @duffleit User <μService> Account <μService> WebBanking transferMoney triggerPayment createTransactions New

    Payment 💸 € 20, 00 👧 Lisa to David from Perform Payment Legder <μService> Queue Queue Queue
  39. @duffleit User <μService> Account <μService> WebBanking transferMoney triggerPayment createTransactions New

    Payment 💸 € 20, 00 👧 Lisa to David from Perform Payment Legder <μService> Queue Queue Queue As a Customer, I want my transaction to be booked by the ledger.
  40. @duffleit User <μService> Account <μService> WebBanking transferMoney triggerPayment createTransactions New

    Payment 💸 € 20, 00 👧 Lisa to David from Perform Payment Legder <μService> Queue Queue Queue As a Customer, I want the account service to update my balance.
  41. @duffleit User <μService> Account <μService> WebBanking transferMoney triggerPayment createTransactions New

    Payment 💸 € 20, 00 👧 Lisa to David from Perform Payment Legder <μService> Queue Queue Queue As a Customer, I want to transfer money to someone else.
  42. @duffleit “ On the Criteria To Be Used in Decomposing

    Systems into Modules — Parnas, 1972
  43. @duffleit User <μService> Account <μService> WebBanking New Payment 💸 €

    20, 00 👧 Lisa to David from Perform Payment Legder <μService> Payments <μService> Domain Services Journey Services As a Customer, I want to transfer money to someone else.
  44. @duffleit User <μService> Account <μService> WebBanking New Payment 💸 €

    20, 00 👧 Lisa to David from Perform Payment Legder <μService> Web-BFF <μService> Domain Services Backend For Frontends As a Customer, I want to transfer money to someone else. Mobile-BFF <μService> Mobile Banking € 20, 00 Pay Payment Flow Payment Flow
  45. @duffleit No Domain Logic in Backend For Frontends. It's about

    Ui-Specific Aggregation, to get rid of over-fetching and over-requesting.
  46. @duffleit User <μService> Account <μService> WebBanking New Payment 💸 €

    20, 00 👧 Lisa to David from Perform Payment Legder <μService> Payments <μService> Domain Services Journey Services
  47. @duffleit User <μService> Account <μService> WebBanking New Payment 💸 €

    20, 00 👧 Lisa to David from Perform Payment Legder <μService> Payments <μService> Domain Services Journey Services Balance <μService>
  48. @duffleit User Account WebBanking New Payment 💸 € 20, 00

    👧 Lisa to David from Perform Payment Transactions Payments Domain Services Journey Services Onboarding Fraud Detection User Account Account Transactions
  49. @duffleit User Account WebBanking New Payment 💸 € 20, 00

    👧 Lisa to David from Perform Payment Transactions Payments Domain Services Journey Services Onboarding Fraud Detection User Account Account Transactions ⚡ ⚡ ⚡
  50. @duffleit WebBanking New Payment 💸 € 20, 00 👧 Lisa

    to David from Perform Payment Payments Journey Services Onboarding Fraud Detection User Account Account Transactions User Account Transactions Service Autnomy
  51. @duffleit WebBanking New Payment 💸 € 20, 00 👧 Lisa

    to David from Perform Payment Payments Journey Services Onboarding Fraud Detection User Account Account Transactions User Account Transactions Data Duplication ⚡
  52. @duffleit WebBanking New Payment 💸 € 20, 00 👧 Lisa

    to David from Perform Payment Payments Journey Services Onboarding Fraud Detection User Account Account Transactions User Account Transactions Data Syncronisation 🤯 ⚡
  53. @duffleit WebBanking New Payment 💸 € 20, 00 👧 Lisa

    to David from Perform Payment Payments Journey Services Onboarding Fraud Detection User Account Account Transactions User Account Transactions
  54. @duffleit WebBanking New Payment 💸 € 20, 00 👧 Lisa

    to David from Perform Payment Payments Journey Services Onboarding Fraud Detection User Account Account Transactions User Account Transactions Synchronous Calls 😔
  55. @duffleit WebBanking New Payment 💸 € 20, 00 👧 Lisa

    to David from Perform Payment Payments Journey Services Onboarding Fraud Detection User Account Account Transactions User Account Transactions Synchronous Calls 😔
  56. @duffleit WebBanking New Payment 💸 € 20, 00 👧 Lisa

    to David from Perform Payment Payments Journey Services Onboarding Fraud Detection User Account Account Transactions User Cache Account Transactions Synchronous Calls 😔
  57. @duffleit “ we project data from our counter variable into

    our doubled variable. There must be a better solution 🤔
  58. @duffleit “ we project the data from our onboarding service

    into our payments service. There must be a better solution 🤔 Payments User Onboarding User project
  59. @duffleit WebBanking New Payment 💸 € 20, 00 👧 Lisa

    to David from Perform Payment Payments Journey Services Onboarding Fraud Detection User Account Account Transactions User Account Transactions Stream
  60. @duffleit WebBanking New Payment 💸 € 20, 00 👧 Lisa

    to David from Perform Payment Payments Journey Services Onboarding Fraud Detection User Account Account Transactions User Account Transactions Stream
  61. @duffleit WebBanking New Payment 💸 € 20, 00 👧 Lisa

    to David from Perform Payment Payments Journey Services Onboarding Fraud Detection User Account Account Transactions User Account Transactions Stream
  62. @duffleit WebBanking New Payment 💸 € 20, 00 👧 Lisa

    to David from Perform Payment Payments Journey Services Onboarding Fraud Detection User Account Account Transactions User Account Transactions Stream
  63. @duffleit WebBanking New Payment 💸 € 20, 00 👧 Lisa

    to David from Perform Payment Payments Journey Services Onboarding Fraud Detection User Account Account Transactions User Account Transactions Stream Projections
  64. @duffleit WebBanking New Payment 💸 € 20, 00 👧 Lisa

    to David from Perform Payment Payments Journey Services Onboarding Fraud Detection User Account Account Transactions User Account Transactions Stream Projections
  65. @duffleit WebBanking New Payment 💸 € 20, 00 👧 Lisa

    to David from Perform Payment Payments Journey Services Onboarding Fraud Detection User Account Account Transactions User Account Transactions Stream Projections
  66. @duffleit WebBanking New Payment 💸 € 20, 00 👧 Lisa

    to David from Perform Payment Payments Journey Services Onboarding Fraud Detection User Account Account Transactions User Account Transactions Stream Projections
  67. @duffleit WebBanking New Payment 💸 € 20, 00 👧 Lisa

    to David from Perform Payment Payments Journey Services Onboarding Fraud Detection User Account Account Transactions User Account Transactions Stream
  68. @duffleit WebBanking New Payment 💸 € 20, 00 👧 Lisa

    to David from Perform Payment Payments Journey Services Onboarding Fraud Detection User Account Account Transactions User Account Transactions Stream Projections
  69. @duffleit Eventual Consistency Eventual Divergence Dashboard User (age: 22) UserChanged

    (age: 21) UserChanged (age: 22) Profile User (age: 21) ⚡ timestamp timestamp
  70. @duffleit Eventual Consistency Eventual Divergence Eventual Variance Ledger Dashboard Stream

    🔥 Transaction (+10€) Transaction (+10€) Balance: 20€
  71. @duffleit Eventual Consistency Eventual Divergence Eventual Variance Eventual Latency Service

    B Stream UserChanged (age: 21) UserChanged (age: 22) Profile User (age: 21) Dashboard User (age: 21) User (age: 22)
  72. Single User Context @duffleit Eventual Consistency Eventual Divergence Eventual Variance

    Eventual Latency Service B Stream UserChanged (age: 21) UserChanged (age: 22) Profile User (age: 21) Dashboard User (age: 21) User (age: 22) 🕰
  73. @duffleit Eventual Consistency Eventual Divergence Eventual Variance Eventual Latency same

    events, different results. same events, different quantity. same events, different realisation. Ordering Guarantees Optimistic UIs At-Least-Once Delivery Deduplication Mechanisms
  74. @duffleit WebBanking New Payment 💸 € 20, 00 👧 Lisa

    to David from Perform Payment Payments Journey Services Onboarding Fraud Detection User Account Account Transactions User Account Transactions Stream Projections
  75. @duffleit Mobile Banking Usage 93% — Show balance & last

    transactions 3% — Initiate new payment 4% — Any other functionality
  76. @duffleit Payments Journey Services Onboarding Overview User Account Account Transactions

    User Account Transactions Stream 93% of what our users need can still be performed. WebBanking Current Balance: 200€ 👧 You sent Lisa 100€ Christoph sent you 300€
  77. @duffleit WebBanking Current Balance: 200€ 👧 You sent Lisa 100€

    Christoph sent you 300€ Payments Journey Services Onboarding Overview User Account Transactions User Account Transactions Stream Overview Transactions We can easily scale horizontally.
  78. @duffleit WebBanking Current Balance: 200€ 👧 You sent Lisa 100€

    Christoph sent you 300€ Payments Journey Services Onboarding Overview User Account Transactions User Account Transactions Stream Overview Transactions We can easily scale horizontally.
  79. @duffleit WebBanking of David Current Balance: 300€ Christoph sent you

    300€ Payments Journey Services Onboarding Overview User Account Transactions User Account Transactions Stream WebBanking of Lisa 👧 New Payment 💸 € 20, 00 David to 👧 Lisa from Perform Payment
  80. @duffleit WebBanking of David Current Balance: 300€ Christoph sent you

    300€ Payments Journey Services Onboarding Overview User Account Transactions User Account Transactions Stream WebBanking of Lisa 👧 New Payment 💸 € 20, 00 David to 👧 Lisa from Perform Payment
  81. @duffleit WebBanking of David Current Balance: 300€ Christoph sent you

    300€ Payments Journey Services Onboarding Overview User Account Transactions User Account Transactions Stream WebBanking of Lisa 👧 New Payment 💸 € 20, 00 David to 👧 Lisa from Perform Payment
  82. @duffleit WebBanking of David Current Balance: 300€ Christoph sent you

    300€ Payments Journey Services Onboarding Overview User Account Transactions User Account Transactions Stream WebBanking of Lisa 👧 New Payment 💸 € 20, 00 David to 👧 Lisa from Perform Payment
  83. @duffleit WebBanking of David Current Balance: 300€ Christoph sent you

    300€ Payments Journey Services Onboarding Overview User Account Transactions User Account Transactions Stream WebBanking of Lisa 👧 New Payment 💸 € 20, 00 David to 👧 Lisa from Perform Payment
  84. @duffleit WebBanking of David Current Balance: 300€ Christoph sent you

    300€ Payments Journey Services Onboarding Overview User Account Transactions User Account Transactions Stream WebBanking of Lisa 👧 New Payment 💸 € 20, 00 David to 👧 Lisa from Perform Payment
  85. @duffleit WebBanking of David Current Balance: 300€ Christoph sent you

    300€ Payments Journey Services Onboarding Overview User Account Transactions User Account Transactions Stream WebBanking of Lisa 👧 New Payment 💸 € 20, 00 David to 👧 Lisa from Perform Payment
  86. @duffleit WebBanking of David Current Balance: 300€ Christoph sent you

    300€ Payments Journey Services Onboarding Overview User Account Transactions User Account Transactions Stream WebBanking of Lisa 👧 New Payment 💸 € 20, 00 David to 👧 Lisa from Perform Payment 👧 Lisa sent you 20€
  87. @duffleit WebBanking of David Current Balance: 320€ Christoph sent you

    300€ Payments Journey Services Onboarding Overview User Account Transactions User Account Transactions Stream WebBanking of Lisa 👧 New Payment 💸 € 20, 00 David to 👧 Lisa from Perform Payment 👧 Lisa sent you 20€
  88. @duffleit WebBanking of David Current Balance: 320€ Christoph sent you

    300€ Payments Journey Services Onboarding Overview User Account Transactions User Account Transactions Stream WebBanking of Lisa 👧 New Payment 💸 € 20, 00 David to 👧 Lisa from Perform Payment 👧 Lisa sent you 20€ GraphQL subscriptions mutations Out-of-the-box real-time capabilities.
  89. @duffleit WebBanking of David Current Balance: 320€ Christoph sent you

    300€ Payments Journey Services Legacy System Accounts Stream 👧 Lisa sent you 20€ User 😮 💨😮 💨 😮 💨 Change Data Capture (CDC) User User
  90. Third Generation of MicroServices Fully Reactive @duffleit High Resilience 🔥

    Horizontal Scaling ↔ Real Time Integration ⏱ Good Integration with Legacy Systems 🏚
  91. Dimensions of Scaling Vertical Horizontal Service Service Service User from

    User from Users from Service Service Service Sharding
  92. @duffleit Stream UserTriggeredPayment Partition 0 Partition 1 Partition 2 UserTriggeredPayment

    Payments Payments Payments Stream ValidPaymentReceived Partition 0 Partition 1 Partition 2
  93. Fraud Detection Fraud Detection @duffleit Stream UserTriggeredPayment Partition 0 Partition

    1 Partition 2 UserTriggeredPayment Payments Payments Payments Stream ValidPaymentReceived Partition 0 Partition 1 Partition 2 Fraud Detection PaymentCheckedAgainstFraud
  94. Fraud Detection Fraud Detection @duffleit Stream UserTriggeredPayment Partition 0 Partition

    1 Partition 2 UserTriggeredPayment Payments Payments Payments Stream ValidPaymentReceived Partition 0 Partition 1 Partition 2 Fraud Detection Stream PaymentChecked Partition 0 Partition 1 Partition 2
  95. Fraud Detection Fraud Detection @duffleit Stream UserTriggeredPayment Partition 0 Partition

    1 Partition 2 UserTriggeredPayment Payments Payments Payments Stream ValidPaymentReceived Partition 0 Partition 1 Partition 2 Fraud Detection Stream PaymentChecked Partition 0 Partition 1 Partition 2 Ledger Ledger Ledger TransactionBooked
  96. Fraud Detection Fraud Detection @duffleit Stream UserTriggeredPayment Partition 0 Partition

    1 Partition 2 UserTriggeredPayment Payments Payments Payments Stream ValidPaymentReceived Partition 0 Partition 1 Partition 2 Fraud Detection Stream PaymentChecked Partition 0 Partition 1 Partition 2 Ledger Ledger Ledger Partition 0 Partition 1 Partition 2 Stream TransactionBooked Project Transactions Streams Flink
  97. Fraud Detection Fraud Detection @duffleit Stream UserTriggeredPayment Partition 0 Partition

    1 Partition 2 UserTriggeredPayment Payments Payments Payments Stream ValidPaymentReceived Partition 0 Partition 1 Partition 2 Fraud Detection Stream PaymentChecked Partition 0 Partition 1 Partition 2 Ledger Ledger Ledger Partition 0 Partition 1 Partition 2 Stream TransactionBooked Project Transactions Shard 0 Shard 1 Shard 2 DataSink WebBanking Current Balance: 200€ 👧 You sent Lisa 100€ Christoph sent you 300€ Streams Flink
  98. Fraud Detection Fraud Detection @duffleit Stream UserTriggeredPayment Partition 0 Partition

    1 Partition 2 UserTriggeredPayment Payments Payments Payments Stream ValidPaymentReceived Partition 0 Partition 1 Partition 2 Fraud Detection Stream PaymentChecked Partition 0 Partition 1 Partition 2 Ledger Ledger Ledger Partition 0 Partition 1 Partition 2 Stream TransactionBooked Project Transactions WebBanking Current Balance: 200€ 👧 You sent Lisa 100€ Christoph sent you 300€ Shard 0 Shard 1 Shard 2 DataSink Streams Flink
  99. Fraud Detection Fraud Detection @duffleit Stream UserTriggeredPayment Partition 0 Partition

    1 Partition 2 UserTriggeredPayment Payments Payments Payments Stream ValidPaymentReceived Partition 0 Partition 1 Partition 2 Fraud Detection Stream PaymentChecked Partition 0 Partition 1 Partition 2 Ledger Ledger Ledger Partition 0 Partition 1 Partition 2 Stream TransactionBooked Project Transactions WebBanking Current Balance: 200€ 👧 You sent Lisa 100€ Christoph sent you 300€ Shard 0 Shard 1 Shard 2 DataSink 🚀 We can scale nearly unlimited.
  100. Monolith Reactive Push-Based Async Pull-Based Streamed Availability 🟢 , Resilience

    🦺 , Scalability ↔ , Throughput 🚀 Complexity 💰 @duffleit
  101. Monolith Reactive Push-Based Async Pull-Based Streamed @duffleit The Rise of

    Reactive Microservices. And the future of fully Stream Based Architectures.