how events are reshaping modern systems

Post on 22-Jan-2018

226 Views

Category:

Engineering

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

How Events Are Reshaping Modern Systems

Jonas Bonér @jboner

Why Events?

1. Events drive autonomy 2. Events help reduce risk 3. Events help you move faster 4. Events Increase Loose coupling 5. Events increase stability 6. Events increase scalability 7. Events increase resilience 8. Events increase traceability 9. Events allow for time-travel

Why Should you care?

1. Cloud and multicore architectures 2. Microservices and distributed systems 3. Data-centric applications 4. “We want more, of everything, and we want it now.” - Your Customers

Why Now?1. Cloud and multicore architectures 2. Microservices and distributed systems 3. Data-centric applications 4. “We want more, of everything, and we want it now.” - Your Customers

Do Not Settle For

Microliths

Do Not Settle For

Microliths

“Event-Driven Architecture (EDA) is a design paradigm in which a software component executes in response

to receiving one or more event notifications.”- Gartner

Event Driven Architecture To The Rescue

What is an

Event?

Event“Something that happens.”

- Merriam Webster

The Nature of Events

✴ Events represent Facts of information ➡ Facts are immutable

➡ Facts Accrue - Knowledge can only grow

The Nature of Events

✴ Events represent Facts of information ➡ Facts are immutable

➡ Facts Accrue - Knowledge can only grow

✴ Events/Facts can be disregarded/Ignored

The Nature of Events

✴ Events represent Facts of information ➡ Facts are immutable

➡ Facts Accrue - Knowledge can only grow

✴ Events/Facts can be disregarded/Ignored✴ Events/Facts Can not be retracted (once accepted)

The Nature of Events

✴ Events represent Facts of information ➡ Facts are immutable

➡ Facts Accrue - Knowledge can only grow

✴ Events/Facts can be disregarded/Ignored✴ Events/Facts Can not be retracted (once accepted)✴ Events/Facts Can not be deleted (once accepted)

➡ Might be needed for legal or moral reasons

The Nature of Events

✴ Events represent Facts of information ➡ Facts are immutable

➡ Facts Accrue - Knowledge can only grow

✴ Events/Facts can be disregarded/Ignored✴ Events/Facts Can not be retracted (once accepted)✴ Events/Facts Can not be deleted (once accepted)

➡ Might be needed for legal or moral reasons

✴ Events/Facts (new) can invalidate existing Facts

The Nature of Events

Event Loop What Makes Event Tick

✴ Queue + anonymous Callbacks

✴ The Hollywood principle

✴ At-Most-Once delivery guarantees

✴ Local context only

✴ Sync or AsynC

✴ Limited and quite powerless

The Event Loop

✴ Queue + anonymous Callbacks

✴ The Hollywood principle

✴ At-Most-Once delivery guarantees

✴ Local context only

✴ Sync or AsynC

✴ Limited and quite powerless

The Event Loop

*

* Too limited as a general model of computation, and programming model for modern distributed systems. But is a useful building block.

✴ Ephemeral and anonymous

✴ No sane failure model Error Channel - console.log(‘4/0=err’, err)

✴ No composition Signature: Input => Side-effect - (Any => Unit)

✴ Hard to Debug

✴ Hard to reason about

✴ Leads to Callback hell

The Problem With Event Callbacks

https://techbrunch.gousto.co.uk/2016/04/22/callback-hell/

✴ Patterns Observer, Pub-Sub, Broadcast, …

✴ Futures & PRomises

✴ Dataflow Variables

✴ Stream Processing ✴ Event-driven Microservices ✴ FaaS

We Need High Level

Abstractions

Unified Event Driven Abstractions Powered By

Message Driven Fabric

Ladder of abstraction

Unified Event Driven Abstractions Powered By

Message Driven Fabric

Network Boundary

Ladder of abstraction

Unified Event Driven Abstractions Powered By

Message Driven Fabric

Network Boundary

Ladder of abstraction

Unified Event Driven Abstractions Powered By

Message Driven Fabric

Network Boundary

Ladder of abstraction

Unified Event Driven Abstractions Powered By

Message Driven Fabric

Unified API (Event-driven Microservices, Patterns, Streams, Futures, FaaS,…)

Network Boundary

Ladder of abstraction

Unified Event Driven Abstractions Powered By

Message Driven Fabric

Unified API (Event-driven Microservices, Patterns, Streams, Futures, FaaS,…)

Network Boundary

Event 1 Ladder of abstraction

Unified Event Driven Abstractions Powered By

Message Driven Fabric

Unified API (Event-driven Microservices, Patterns, Streams, Futures, FaaS,…)

Local Event Loop

Network Boundary

Event 1 Ladder of abstraction

Unified Event Driven Abstractions Powered By

Message Driven Fabric

Unified API (Event-driven Microservices, Patterns, Streams, Futures, FaaS,…)

Local Event Loop

Distribution Fabric

Network Boundary

Event 1 Ladder of abstraction

Unified Event Driven Abstractions Powered By

Message Driven Fabric

Unified API (Event-driven Microservices, Patterns, Streams, Futures, FaaS,…)

Local Event Loop

Distribution Fabric Distribution Fabric

Network Boundary

Message Passing

Event 1 Ladder of abstraction

Unified Event Driven Abstractions Powered By

Message Driven Fabric

Unified API (Event-driven Microservices, Patterns, Streams, Futures, FaaS,…)

Local Event Loop

Distribution Fabric

Local Event Loop

Distribution Fabric

Network Boundary

Message Passing

Event 1 Ladder of abstraction

Unified Event Driven Abstractions Powered By

Message Driven Fabric

Unified API (Event-driven Microservices, Patterns, Streams, Futures, FaaS,…)

Local Event Loop

Distribution Fabric

Local Event Loop

Distribution Fabric

Network Boundary

Message Passing

Event 1 Ladder of abstraction

Unified Event Driven Abstractions Powered By

Message Driven Fabric

Unified API (Event-driven Microservices, Patterns, Streams, Futures, FaaS,…)

Local Event Loop

Distribution Fabric

Local Event Loop

Distribution Fabric

Network Boundary

Message Passing

Event 1 Event 1 Ladder of abstraction

Unified Event Driven Abstractions Powered By

Message Driven Fabric

Unified API (Event-driven Microservices, Patterns, Streams, Futures, FaaS,…)

Local Event Loop

Distribution Fabric

Local Event Loop

Distribution Fabric

Network Boundary

Message Passing

Event 1 Event 1

Reactive Systems is doing the heavy lifting

Ladder of abstraction

Unified Event Driven Abstractions Powered By

Message Driven Fabric

Unified API (Event-driven Microservices, Patterns, Streams, Futures, FaaS,…)

Local Event Loop

Distribution Fabric

Local Event Loop

Distribution Fabric

Network Boundary

Message Passing

Event 1 Event 1

Reactive Systems is doing the heavy lifting

Ladder of abstraction Reactive Programming

1. REceive and react to facts (or not), that are coming its way

2. Publish new facts (as events) to the rest of the world

3. Invert the control flow to minimize coupling and increase autonomy

Event Driven

Services

Mutable State Needs To Be Contained And Non Observable

Publish Facts To Outside World

Event Stream

Event Stream

Use The

as the integration fabric

Event Driven

Services

Event Driven

Services

Event Driven

Services

Command

Event Driven

Services

Command

Event Driven

Services

Command

Event Driven

Services

Command

Event

Event Stream

Event Driven

Services

Command

Event

Event Event Event Stream

Event Driven

Services

Command

Event

Event Event Event Stream

Event Driven

Services

Command

Event

Event Event Event Stream

Event Driven

Services

Command

Event

Event Event Event Stream

Event Driven

Services

Command

Event

Event Event Event Stream

Event Driven

Services

EventualConsistency

Command

Event

Event Event Event Stream

Event Driven

Services

EventualConsistency

Command

Event

Event Event Event Stream

Eventual Consistency

Eventual Consistency

No One Wants

It’s a necessery evil

But Relax It Is How The World Works

Information Has Latency

Information Is Always

From the Past

Welcome To The Wild Ocean Of

Non Determinism Distributed Systems

“In a system which cannot count on distributed transactions, the

management of uncertainty must be implemented in the business logic.”

- Pat Helland

Life Beyond Distributed Transactions - An Apostate’s Opinion, Pat Helland (2007)

We Need To Model

Uncertainty

Exploit Reality

Exploit Reality

We need to

In our design

Events Can Lead To Greater

Certainty

Events Can Help Us Craft Autonomous Islands Of Determinism

What does it mean to be

Automonous?

From greek: Auto-nomos

✴ Auto meaning self

✴ Nomos meaning Law

Autonomy

Promise Theory

Promise Theory

Let

Lead the way

✴Impositions diverge into unpredictable outcomes from definite beginnings ⇒ Distributed information ⇒ Decreased certainty

Convergence vs.

Divergence of information

✴Promises converge towards a definite outcome from unpredictable beginnings ⇒ Local information ⇒ Improved certainty

“Autonomy makes information local, leading to greater certainty and stability.”

“An autonomus component can only promise its own behavior.”

- Mark Burgess

In Search of Certainty, Thinking in Promises - Mark Burgess

Benefits of Thinking in Promises

✴ If a service only promises its own behavior Then all information needed to ➡ Resolve a conflict ➡ Repair under failure ➡ Is available within the service itself

Benefits of Thinking in Promises

✴ If a service only promises its own behavior Then all information needed to ➡ Resolve a conflict ➡ Repair under failure ➡ Is available within the service itself

✴ Promises remove the need for needless 1. Communication 2. Coordination 3. Consensus

Benefits of Thinking in Promises

“The first principle of successful scalability is to batter the consistency

mechanisms down to a minimum.”- James Hamilton

As transcribed in: Toward a Cloud Computing Research Agenda. SIGACT News, 40(2):68–80, June 2009.

Events First Design Drives Autonomy

Events First Domain Driven

Design

“When you start modeling events, it forces you to think about the behavior of the system. As opposed to thinking

about the structure of the system.”- Greg Young

A Decade of DDD, CQRS, Event Sourcing, Greg Young (Presentation from 2016)

✴ Don’t focus on the things The Nouns The Domain Objects

✴ Focus on what happens The Verbs The Events

Mine the

Facts

Event Storming

Event Driven Design

✴ IntentS ➡ Communication ➡ Conversations ➡ Expectations ➡ Contracts ➡ Control Transfer

Event Driven Design

✴ IntentS ➡ Communication ➡ Conversations ➡ Expectations ➡ Contracts ➡ Control Transfer

Event Driven Design

✴ Facts ➡ State ➡ History ➡ Causality ➡ Notifications ➡ State Transfer

✴ IntentS ➡ Communication ➡ Conversations ➡ Expectations ➡ Contracts ➡ Control Transfer

Event Driven Design

✴ Facts ➡ State ➡ History ➡ Causality ➡ Notifications ➡ State Transfer

Commands

✴ IntentS ➡ Communication ➡ Conversations ➡ Expectations ➡ Contracts ➡ Control Transfer

Event Driven Design

✴ Facts ➡ State ➡ History ➡ Causality ➡ Notifications ➡ State Transfer

Commands Events

Event Driven Design

✴Commands ➡ Object form of method/Action request ➡ Imperative: CreateOrder, ShipProduct

Event Driven Design

✴Commands ➡ Object form of method/Action request ➡ Imperative: CreateOrder, ShipProduct

✴Reactions ➡ Represents side-effects

Event Driven Design

✴Commands ➡ Object form of method/Action request ➡ Imperative: CreateOrder, ShipProduct

✴Reactions ➡ Represents side-effects

✴Events ➡ Represents something that has happened ➡ Past-tense: OrderCreated, ProductShipped

Event Driven Design

Commands Eventsvs

Commands Eventsvs1. All about intent 1. Intentless

Commands Eventsvs1. All about intent2. Directed

1. Intentless2. Anonymous

Commands Eventsvs1. All about intent2. Directed3. Single addressable destination

1. Intentless2. Anonymous3. Just happens - for others (0-N) to observe

Commands Eventsvs1. All about intent2. Directed3. Single addressable destination

4. Models personal communication

1. Intentless2. Anonymous3. Just happens - for others (0-N) to observe

4. Models broadcast (speakers corner)

Commands Eventsvs1. All about intent2. Directed3. Single addressable destination

4. Models personal communication

5. Distributed focus

1. Intentless2. Anonymous3. Just happens - for others (0-N) to observe

4. Models broadcast (speakers corner)

5. Local focus

Commands Eventsvs1. All about intent2. Directed3. Single addressable destination

4. Models personal communication

5. Distributed focus6. Command & Control

1. Intentless2. Anonymous3. Just happens - for others (0-N) to observe

4. Models broadcast (speakers corner)

5. Local focus6. Autonomy

Let the Events Define the

Bounded Context

Principles For Promise Theory Driven

Protocol Design

1. Convergency Promises should reach a desired state, a stable outcome - idempotent behavior

Principles For Promise Theory Driven

Protocol Design

1. Convergency Promises should reach a desired state, a stable outcome - idempotent behavior

2. Embracing Failure Expect things to go wrong Promises may or may not be kept

Principles For Promise Theory Driven

Protocol Design

1. Convergency Promises should reach a desired state, a stable outcome - idempotent behavior

2. Embracing Failure Expect things to go wrong Promises may or may not be kept

3. Autonomy You can’t rely on other services

Principles For Promise Theory Driven

Protocol Design

✴ Maintains Integrity & consistency

✴ Is our Unit of Consistency

✴ Is our Unit of Failure

✴ Is our Unit of Determinism

✴ Is fully Autonomous

The Aggregate

Enough Talk Show Me The

Code

Sample in Java: https://gist.github.com/jboner/4361c710d2e2386be8bddc39edb0528a Sample in Scala: https://gist.github.com/jboner/dea4aa819e127d543d684208d74081b5

Enough Talk Show Me The

Code

Sample in Java: https://gist.github.com/jboner/4361c710d2e2386be8bddc39edb0528a Sample in Scala: https://gist.github.com/jboner/dea4aa819e127d543d684208d74081b5

Are we done now?

Are we done now?Perhaps. We have come a long way.

Are we done now?Perhaps. We have come a long way.But events can also be used for:

Are we done now?Perhaps. We have come a long way.But events can also be used for:

➡ Persistence

Are we done now?Perhaps. We have come a long way.But events can also be used for:

➡ Persistence➡ Managing time

Event Based Persistence

“Update-in-place strikes systems designers as a cardinal sin: it violates

traditional accounting practices that have been observed for hundreds of years.”

- jim Gray

The Transaction Concept, Jim Gray (1981)

Event Logging The Bedrock

Event Sourcing A Cure For the Cardinal Sin

“The truth is the log. The database is a cache of a subset of the log.”

- Pat Helland

Immutability Changes Everything, Pat Helland (2015)

Event Sourced Services

Happy Path

Event Sourced Services

Happy Path

Event Sourced Services

1) Receive and verify Command (“ApprovePayment”)

Happy Path

Event Sourced Services

2) Create new Event (“PaymentApproved”)

1) Receive and verify Command (“ApprovePayment”)

Happy Path

Event Sourced Services

2) Create new Event (“PaymentApproved”)

1) Receive and verify Command (“ApprovePayment”)

3) Append Event to Event Log

Happy Path

Event Sourced Services

2) Create new Event (“PaymentApproved”)

1) Receive and verify Command (“ApprovePayment”)

3) Append Event to Event Log

4) Update internal component state

Happy Path

Event Sourced Services

5) Run side-effects (approve the payment)

2) Create new Event (“PaymentApproved”)

1) Receive and verify Command (“ApprovePayment”)

3) Append Event to Event Log

4) Update internal component state

SAD Path - recovering from failure

Happy Path

Event Sourced Services

5) Run side-effects (approve the payment)

2) Create new Event (“PaymentApproved”)

1) Receive and verify Command (“ApprovePayment”)

3) Append Event to Event Log

4) Update internal component state

SAD Path - recovering from failure

Happy Path

Event Sourced Services

5) Run side-effects (approve the payment)

2) Create new Event (“PaymentApproved”)

1) Receive and verify Command (“ApprovePayment”)

3) Append Event to Event Log

4) Update internal component state

1) Rehydrate Events from Event Log

SAD Path - recovering from failure

Happy Path

Event Sourced Services

5) Run side-effects (approve the payment)

2) Create new Event (“PaymentApproved”)

1) Receive and verify Command (“ApprovePayment”)

3) Append Event to Event Log

4) Update internal component state

1) Rehydrate Events from Event Log

2) Update internal component state

SAD Path - recovering from failure

Happy Path

Event Sourced Services

5) Run side-effects (approve the payment)

2) Create new Event (“PaymentApproved”)

1) Receive and verify Command (“ApprovePayment”)

3) Append Event to Event Log

4) Update internal component state

1) Rehydrate Events from Event Log

2) Update internal component state

Memory Image

Event Sourcing

✴ One single Source of Truth with All history ✴ Allows for Memory Image - durable in-memory state ✴ Avoids the Object-relational mismatch ✴ Allows others to Subscribe to state changes ✴ Mechanical sympathy (Single Writer Principle etc.)

✴ Unfamiliar model ✴ Versioning of events

✴ Deletion of events (legal or moral reasons)

Disadvantages Of Using Event Sourcing

Events Allow Us To Manage

Time

“Modeling events forces you to have a temporal focus on what’s going on in the system.

Time becomes a crucial factor of the system.”- Greg Young

A Decade of DDD, CQRS, Event Sourcing, Greg Young (Presentation from 2016)

But, What is Time

Really?

Causality

How We Make Sense Of The World

Time Is the Succession Of Causally Related Events

✴ Event is a snapshot in time ✴ Event ID is an index for time ✴ Event Log is our full history

The database of Our past

The path to Our present

Event Sourcing Allows Us To

Model Time

Event Sourcing Allows For

Time Travel

Event Sourcing Allows For

Time Travel

Event Sourcing Allows For

Time Travel

✴Replay the log for historic debugging ✴Replay the log for auditing & traceability ✴Replay the log on failure

✴Replay the log for replication

“The future is a function of the past.”- A. P. Robertson

“The (local) present is a merge function of multiple concurrent pasts.”

- me

val newLocalPresent = observedPasts. foldLeft(oldLocalPresent) { _ merge _ }

We need to explicitly model the

local present as facts derived from the

merging of multiple

concurrent pasts

We Can Even Fork the Past

...Or Join Two Distinct Pasts

Let Make Our Demo

Event Sourced

Untangle Your Read and Write Models

With CQRS

CQRS

CQRS

CQRS

Write Side Model

Commands

CQRS

Write Side Model

Write to Event Log

Commands

CQRS

Write Side Model

Events

Write to Event Log

Commands

CQRS

Write Side Model

Events

Events

Write to Event Log

Commands

CQRS

Read Side Model

Write Side Model

Events

Events

Read Data Store

Write to Event Log

Commands

CQRS

Read Side Model

Write Side Model

Events

Queries

Events

Read Data Store

Write to Event Log

Commands

CQRS

Read Side Model

Write Side Model

Events

Queries

Events

Read Data Store

Write to Event Log

EventualConsistency

Commands

✴ Temporal Decoupling ✴ Increased Resilience ✴ Increased Scalability

✴ Allows for Multiple Event subscribers ✴ Allows for Polyglot Persistence

Advantages Of Using CQRS

✴ More infrastructure to manage ✴ 2 data models (or more) to maintain ✴ Eventual Consistency

Disadvantages Of Using CQRS

Key Takeaways

Key Takeaways

Event driven design helps you to: ✴ Design autonomous services ✴ Move Faster towards a Reactive architecture ✴ reduce risk when modernizing applications ✴ Balance Certainty and Uncertainty

Key Takeaways

Event driven design helps you to: ✴ Design autonomous services ✴ Move Faster towards a Reactive architecture ✴ reduce risk when modernizing applications ✴ Balance Certainty and Uncertainty

Event Logging allows you to: ✴ take control of your system’s history ✴ time-travel

✴ Balance Strong and eventual consistency

Learn MoreDownload my latest book for free at: bit.ly/reactive-microsystems

top related