JAX London Slides

82

Transcript of JAX London Slides

Page 1: JAX London Slides
Page 2: JAX London Slides

Microservices in a Streaming

World

Page 3: JAX London Slides
Page 4: JAX London Slides

What are microservices really about?

Page 5: JAX London Slides

GUI

UI Service

Orders Service

Returns Service

Fulfilment Service

Payment Service

Stock Service

Collaboration?

Page 6: JAX London Slides

Orders Service

Autonomy?

Page 7: JAX London Slides

Internal World

External world

External world

External World

External world

Service Boundary

Page 8: JAX London Slides

User-Orders Statement getOpenOrders(),

Less Surface Area = Less Coupling

Encapsulate State

Encapsulate Functionality

Encapsulation => Loose Coupling

Page 9: JAX London Slides

Independence gives services their value

Page 10: JAX London Slides

Orders Service

Stock Service

Email Service

Fulfillment Service

Independently Deployable

Independently Deployable

Independently Deployable

Independently Deployable

Page 11: JAX London Slides

It’s hard to scale individual applications

What happens when we grow?

Page 12: JAX London Slides

Companies are inevitably a collection of applications They must work together to some degree

Page 13: JAX London Slides

Inverse Conway Maneuver

The 'Inverse Conway Maneuver' recommends evolving your team and organizational structure to promote your desired

architecture. !

Org Structure

Software Architecture

Page 14: JAX London Slides

But independence comes at a cost

$$$

Page 15: JAX London Slides

Change 1 Change 2

Redeploy

Singly-deployable apps are easy

Page 16: JAX London Slides

User-Orders Statement getOpenOrders(),

Independently Deployable Independently Deployable

Synchronized changes are painful

Page 17: JAX London Slides

Single Sign On Business Service authorise(),

It’s unlikely that a Business Service would need the internal SSO state / function to change

Single Sign On

Page 18: JAX London Slides

SSO has a tightly bounded context

Page 19: JAX London Slides

Business services are different

Page 20: JAX London Slides

Catalog Authorisation

Most business services share the same core stream of facts.

Most services live in here

Page 21: JAX London Slides

We need encapsulation to hide internal state

But we need the freedom to slice & dice shared data like any other

dataset

Page 22: JAX London Slides

But data systems have little to do

with encapsulation

Page 23: JAX London Slides

Service Database

Data on inside

Data on outside

Data on inside

Data on outside

Interface hides data

Interface amplifies

data

Databases amplify the data they hold

Page 24: JAX London Slides

The data dichotomy Data systems are about exposing data.

Services are about hiding it.

Page 25: JAX London Slides

This affects services in one of

two ways

Page 26: JAX London Slides

getOpenOrders( fulfilled=false,

deliveryLocation=CA, orderValue=100,

operator=GreatherThan)

Either (1) we constantly add to the interface, as datasets grow

Page 27: JAX London Slides

getOrder(Id)

getOrder(UserId)

getAllOpenOrders()

getAllOrdersUnfulfilled(Id)

getAllOrders()

Services can end up looking like kookie home-grown databases

Page 28: JAX London Slides

...and data amplifies this service

boundary problem

Page 29: JAX London Slides

(2) Give up and move whole datasets en masse

getAllOrders()

Data Copied Internally

Page 30: JAX London Slides

This leads to a different problem

Page 31: JAX London Slides

Data diverges over time

Orders Service

Stock Service

Email Service

Fulfill- ment Service

Page 32: JAX London Slides

The more mutable copies,

the more data will diverge over time

Page 33: JAX London Slides

Nice neat services

Service contract too

limiting

Can we change both services

together, easily? NO

Broaden Contract

Eek $$$

NO

YES

Is it a shared

Database?

Frack it! Just give me ALL the data

Data diverges. (many different

versions of the same facts) Lets encapsulate

Lets centralise to one copy

YES

Start here

Page 34: JAX London Slides

There is competition between these forces

Divergence Accessibility Encapsulation

Page 35: JAX London Slides

Shared database

Service Interfaces

Better Accessibility

Better Independence

No perfect solution

Page 36: JAX London Slides

Is there a better way?

Page 37: JAX London Slides

Data on the Inside

Data on the Outside

Data on the Outside

Data on the Outside

Data on the Outside

Service Boundary

Page 38: JAX London Slides

Make data-on-the-outside a 1st class citizen

Page 39: JAX London Slides

Use a Stream Processing tool-kit

Page 40: JAX London Slides

Kafka is a Streaming Platform

Page 41: JAX London Slides

Kafka: a Streaming Platform

The Log Connectors Connectors

Producer Consumer

Streaming Engine

Page 42: JAX London Slides

The Log?

Page 43: JAX London Slides

Shard on the way in

Producing Services

Kafka

Consuming Services

Page 44: JAX London Slides

Each shard is a queue

Producing Services

Kafka

Consuming Services

Page 45: JAX London Slides

Consumers share load

Producing Services

Kafka

Consuming Services

Page 46: JAX London Slides

Load Balanced Services

Page 47: JAX London Slides

Fault Tolerant Services

Page 48: JAX London Slides

Build ‘Always On’ Services

Rely on Fault Tolerant Broker

Page 49: JAX London Slides

Services can “Rewind & Replay” the log

Rewind & Replay

Page 50: JAX London Slides

Compacted Log (retains only latest version)

Version 3

Version 2

Version 1

Version 2

Version 1

Version 5

Version 4

Version 3

Version 2

Version 1

Page 51: JAX London Slides

Two primitives: (a) Log (append only) (b) Compact-Log (update)

Page 52: JAX London Slides

Service Backbone Scalable, Fault Tolerant, Concurrent, Strongly Ordered, Stateful

The Log Connectors Connectors

Producer Consumer

Streaming Engine

Page 53: JAX London Slides

A place to keep data-on-the-

outside

Page 54: JAX London Slides

Now add Stream Processing

Page 55: JAX London Slides

KStreams: A database engine for data-in-flight

The Log Connectors Connectors

Producer Consumer

Streaming Engine

Page 56: JAX London Slides

Max(price) From orders where ccy=‘GBP’ over 1 day window emitting every second

Continuously Running Queries

Page 57: JAX London Slides

Features: similar to database query engine

Join Filter Aggr- egate

View

Window

Page 58: JAX London Slides

What is Stream Processing?

Table Index

Query Engine

Query Engine vs

Database Finite source

Stream Processor Infinite source

Page 59: JAX London Slides

What is Stateful Stream Processing?

Table Index

Query Engine Query

Engine

vs

Database Finite source

Stateful Stream Processor Infinite & Finite source

Table Compacted Stream

KStreams

Kafka

Page 60: JAX London Slides

Stateful Stream Processing

stream

Compacted stream

Join

Stream Data

Stream-Tabular Data

Windowed Stream

Locally Cached Table

(disk resident)

Kafka Kafka Streams

Page 61: JAX London Slides

Email Confirmation Example

Orders

Customer (Compacted)

Join

Customer Stream

Create Confirmation Emails by Joining

Order “Events” with Customer information

Kafka Email Service

Orders Stream

Page 62: JAX London Slides

Scales Out

Page 63: JAX London Slides

Embeddable

Orders Service Kafka

Orders Service

Orders Service

Page 64: JAX London Slides

Analytic function, Event Driven, all in one.

Analytics Event Driven

Business Services

Page 65: JAX London Slides

Join shared datasets without putting pressure on source services

Email Service

Legacy App Orders Payments Stock

KSTREAMS

Page 66: JAX London Slides

Shared State is only cached in the service, so there is no way to diverge

Email Service

Orders Payments Stock

Lives here !

Cached here!

KSTREAMS

Page 67: JAX London Slides

Services work “Event Driven”, but with the power to join, filter and aggregate embedded in

each service

The Log Connectors Connectors

Producer Consumer

Streaming Engine

Page 68: JAX London Slides

Services work “Event Driven”, but with the power to join, filter and

aggregate embedded in each service

customer orders

catalogue Pay-

ments

Page 69: JAX London Slides

But sometimes you have to move data

Page 70: JAX London Slides

Replicate it, so both copies are identical

Keep Immutable

Page 71: JAX London Slides

Iterate via view regeneration

Page 72: JAX London Slides

Regenerate from the

Log

Fix at source

If you have to move data en masse fix at source and regenerate from the log

Page 73: JAX London Slides

Oracle

Connectors make this easier

The Log

Connector Connector

Producer Consumer

Streaming Engine

Cassandra

Page 74: JAX London Slides

So…

Page 75: JAX London Slides

When building services consider more than just

REST

Page 76: JAX London Slides

The data dichotomy Data systems are about exposing data.

Services are about hiding it.

Remember:

Page 77: JAX London Slides

Shared data is a reality for most organisations

Catalog

Page 78: JAX London Slides

Embrace data that lives in between services

Page 79: JAX London Slides

Avoid data services that have complex / amplifying

interfaces

Page 80: JAX London Slides

Share Data via Immutable Streams

Embed Function into each service

Distributed Log Embedded

KStreams

Page 81: JAX London Slides

Always on, Event-Driven Services

The Log (streams & tables)

Ingestion Services

Services with Polyglotic

persistence

Simple Services

Streaming Services

Page 82: JAX London Slides

Keep it simple, Keep it moving

Twitter: @benstopford

Slides at

benstopford.com

Blog series arriving end of the month at

http://confluent.io/blog