events & microservices

40
Events & Microservices Saul Caganoff, CTO Sixtree @scaganoff Yamen Sader @yaamehn

Upload: yamen-sader

Post on 15-Apr-2017

711 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Events & Microservices

Events & Microservices

Saul Caganoff, CTO Sixtree@scaganoff

Yamen Sader@yaamehn

Page 2: Events & Microservices

Introduction• Asynchrony is considered a microservice characteristic– But not often discussed

• In the top 20 Google results– 7 mentioned async/choreography or events– 3 of those by Chris Richardson or Martin Fowler

• Mostly mentioned in passing• Honourable Mentions:

– http://www.infoq.com/articles/microservices-intro– http://

highscalability.com/blog/2014/4/8/microservices-not-a-free-lunch.html

Page 3: Events & Microservices

WHY EVENTS?

Page 4: Events & Microservices

Bounded Contexts

Finance

Sales

Fulfilment

Product

Online bookstore is the “Hello World” of enterprise systems

http://maribyrnong.com.au

Page 5: Events & Microservices

Sales Context

Wishlist

Book

ISBNTitleAuthorPrice

Order

StatusTimestampSub-totalGSTTotal

Item

Quantity

History

CustomerNameAgeLoyalty Status

Page 6: Events & Microservices

Finance Context

Wishlist

Book

ISBNTitleAuthorPrice

Order

StatusTimestampSub-totalGSTTotal

Item

Quantity

History

CustomerNameAgeLoyalty Status

Credit CardHolder NameNumberExpiryCode

Page 7: Events & Microservices

Fulfilment Context

Book

ISBNTitle

CustomerName

ReceiptOrder NumberSub-totalGSTTotal

AddressStreet NumberStreet NameSuburbPostcode

CourierDepotLocationDriver

Shipment

Dispatch TimeETALocation

Page 8: Events & Microservices

Product Context

Book DescriptionAbstractPicture

Review

Author

NameBiography

InventoryLocationQuantity

ISBNTitlePrice

Page 9: Events & Microservices

Coupling & Cohesion• Cohesion – how well a subsystem forms a

uniting whole– How well a bounded context does its job

• Coupling – the propensity for change in one part of a system to disrupt another– how badly “stuff” leaks across the boundaries

• Coupling is evil – it sneaks into solutions in all kinds of insidious ways– But… distributed monolith is the “worst kind of evil”

Page 10: Events & Microservices
Page 11: Events & Microservices

Coupling & Cohesion• Microservices strive to eliminate coupling• Insidious sources of coupling– Shared databases– Single Common Data Model (vs bounded contexts)– DRY – shared code– APIs generated from code– Poor client code– Misunderstood ‘transactions’– Assumptions about business processes– Organizational structure– Services…

Page 12: Events & Microservices

Business Processes• End-to-end business processes require

coordination across bounded contexts

Finance

Sales Ful-filment

Product

Page 13: Events & Microservices

Business Processes• Browse the inventory• Create order• Enter Shipping Details• Quote shipping charge• Make the payment• Update inventory• Create Shipment• Pick & Pack• Courier• Accept delivery

GET /productsPOST /orderPUT /order/:id/addressGET /3pl/charges?zip=…POST /finance/payment?order=POST /productsPOST /3pl/shipmentGET /3pl/shipment/:idGET /3pl/shipment/:id/addressPUT /3pl/shipment/:id?status=

Page 14: Events & Microservices

Business Processes• Orchestration – Centralized coordination– E.g. the user-agent, BPM engine, service facade– the “god” object

• Hypermedia– HATEOAS– But what about at the edges?– How much should one BC know about another BC?

“microservices architecture will never be SOA done right unless it means building hypermedia systems of microservices” – Jason Bloomberg

http://intellyx.com/2015/07/20/are-microservices-soa-done-right/

Page 15: Events & Microservices

Some Perspective

DB Triggers Monolith Orchestration Hypermedia EDA0

2

4

6

8

10

12

Coupling

Page 16: Events & Microservices

Data Synchronization• How to handle data “owned” by multiple

domains– Glibness: “don’t” have multiple data owners– …in reality it is impossible to eliminate– …especially if legacy or COTS systems involved.

• Some data synchronization is naturally conveyed by the business process

• …some is not• Another topic!

Page 17: Events & Microservices

Choreography• Use events to coordinate activity across bounded

contexts• Publishers & Subscribers are highly decoupled– Event subscribers can come & go minimal or no code or

configuration changes• Publishers & Subscribers are more resilient to

change – either planned or unplanned– E.g. events redelivered in the event of subscriber failure

– either to the restored subscriber, or a replacement

Page 18: Events & Microservices

A Dependency View

Finance

Sales

Sales Tells Finance

Finance

Sales

Finance Asks Sales

Sales

Sales Announces

Page 19: Events & Microservices

Choreography• But trade-offs• Asynchronous events lie at the heart of some of the

microservices challenges– Centralised orchestration is harder to change, but easier

to control/monitor– Event-based choreography is easier to change but

harder to control/monitor• Distributed logging/monitoring systems are needed

to provide a view into asynchronous interactions

Page 20: Events & Microservices

An Aside• No global view may seem like a major downside• But very rare for anyone to know this anyway

• When X happens, we do A and B• When A happens, we do F• Etc

• The more ‘inter-domain’ concerns can be solved by just depending on events, the more likely you are to have the ‘correct’ boundaries

Page 21: Events & Microservices

Coordination• Think about hypermedia inside boundaries• Events outside the boundaries

Finance

Sales Ful-filment

Product

Page 22: Events & Microservices

MODELLING EVENTS

Page 23: Events & Microservices

Commands & Events• Duality between commands & events– Commands cause state transitions– Events reflect state transitions

• An external observer can infer the state of a resource from its event-stream– This is the essence of event-sourcing & CQRS

Page 24: Events & Microservices

State ModellingEmptyCart

FullCart

Quoted

Paid

POST /cart

PUT /cart/:id { book: … }

PUT /cart/:id { book: … }

DELETE /cart/:id/books/:id

PUT /cart/:id { address: … }

POST /payments { cart: …, card: {…}}

Commands (HATEOAS){create: { cart: … } … }

{add: { cart: …, book: {…}} ..}

{add: { cart: …, book: {…}} ..}

{del: { cart: …, book: {…}} ..}

{quoted: { cart: … } … }

{paid: { cart: … } … }

Events (EATNOAS)

Page 25: Events & Microservices

Commands & Events

Finance

Sales Ful-filment

ProductInventoryMarketing

CommandsEvents

Reporting

Logistics

Page 26: Events & Microservices

Event Structure• Immutable structures• Typical properties– Timestamp– Source– Entity URI– Action (state transition)

• The MVP is to notify that a resource has changed and allow subscribers to pull the update if needed

• Don’t forget Postel’s Law, versioning etc

Page 27: Events & Microservices

Event Granularity• Customer details changed?• Or email address changed?

• Some considerations:– Event storm with the business or the technical

specialists, they will call out ‘special’ events– ‘Eye of the Beholder’ ie the subscriber determines

deltas important to them– Expect to get this wrong once or twice

Page 28: Events & Microservices

Concurrency• Race Conditions• The importance of order• Single Master vs Multi-Master• Deltas vs Copies• Action indicators• CRDTs – conflict-free replicated data types

• …think in terms of events rather than copies

Page 29: Events & Microservices

EVENT TRANSPORTS

Page 30: Events & Microservices

Pull vs Push• Pull = subscribers beat– Subscriber never get overwhelmed– Messages pile up on publisher

• Push = publishers beat– Publisher never gets backed up– Subscribers can be overwhelmed

• Answer: use an intermediary tuned to this problem

Page 31: Events & Microservices

Intermediary

Page 32: Events & Microservices

Known Quantity• Events are highly regular– Append only series– Generic attributes (topics, metadata)– Timestamped– Consumed in sequence– Like a very simple database

• Common to standardise on an intermediary– Like standardising on a database– Usually exposed directly, a platform service

Page 33: Events & Microservices

Syndication (Pull)• Service exposes an RSS/atom feed• Consumers do all the hard work:

– Subscription & Concurrency– State Management (where am I up to?)– Retries

• Positives– Very easy…well-known pattern– Web-scale

• Negatives– Polling– High latency– Consumer concurrency very difficult

Page 34: Events & Microservices

Web Hooks (Push)• Service POSTs events to subscribers• Publishers do all the hard work:– Manage subscribers– Managed guaranteed delivery/ retries

• Positives– Not polling, relatively lower latency– Web technology (HTTP endpoints and load balancers)

• Negatives– Consumer concurrency a little harder– Retries and history difficult

Page 35: Events & Microservices

Message Queues (Push)• Events published to queues/topics– E.g JMS, AMQP, ZMQ, SQS/SNS, IronMQ

• Positives– Mature, well-known technologies– Good open-source implementations available– Competing consumer pattern

• Negatives– Extra infrastructure– Reliability depends on reliable file-systems

• SANs, Distributed file-lock managers– No history or replay– Slow consumer problem

Page 36: Events & Microservices

Pull vs Push (redux)• Pull– Subscriber tracks state– Intermediary simplified– Consumer concurrency more difficult– Natural history is kept

• Push– Intermediary tracks consumer state– Can create a bottleneck and contention– Consumer concurrency simpler– Generally no history or replay

Page 37: Events & Microservices
Page 38: Events & Microservices

Apache Kafka• Distributed log

– Consumers tail the logs

• Consumers tail this log, but:– Server manages consumer position (if desired)– Server manages consumer concurrency– Subscription is very simple– Pull is very low latency (push-like)– Replay and history is native– Application level replication

• Others (eg Event Store) provide some similar features (history, pull + push), but none as rich in capability

Page 39: Events & Microservices

Event Processing• Simple events are very useful for data synchronization or

process coordination• Continuum of complexity

• Some tools: Drools, Riemann.io, Apache Storm, Apache Spark (Streaming), Samza, etc

• This is a whole ‘nother topic

Cardinality State Tools

Single event Simple Seriously?

Multiple events/stream Simple Stream processor

Multiple events/stream Complex / Rules Complex Event Processor

Page 40: Events & Microservices

Wrap-Up• Bounded contexts are important

– they promote cohesion and reduce coupling• You need to decide how to coordinate data & processes across

boundaries– Orchestration (relatively higher coupling)– Hypermedia (couples across boundaries)– Events

• Prefer Hypermedia within bounded contexts & events across bounded contexts

Events have many benefits but also some downsides - they are an important tool in your toolbox