event driven programming & architecture

53
Event-driven Programming & Architecture @MarcoEmrich Softwerkskammer Munich Dec. 2017

Upload: marcoemrich

Post on 29-Jan-2018

40 views

Category:

Software


3 download

TRANSCRIPT

Event-driven Programming& Architecture@MarcoEmrich Softwerkskammer Munich Dec. 2017

Sixsteps.com

Where?

GUIhttps://www.flickr.com/photos/joris/2410290034

https://www.flickr.com/photos/11319126@N00/8270409318/in/photostream

Architecture

Microservices

http://martinfowler.com/articles/microservices.html

Evented-SOA

Domain Driven Design

Hexagonal Architecture

Hexagonal Architecture

DomainModel

Hexagonal Architecture

DomainModel

Adapter Adapter

Adapte

rAdapter

Adapte

r

Adapter

Adapter

Adapter

Hexagonal Architecture

DomainModel

Adapter Adapter

Adapte

rAdapter

Adapte

r

Adapter

Adapter

Persistance

Adapter

Hexagonal Architecture

DomainModel

Adapter Adapter

Adapte

rAdapter

Adapte

r

Adapter

Adapter

Persistance

Adapter

GUI

Hexagonal Architecture

DomainModel

Adapter Adapter

Adapte

rAdapter

Adapte

r

Adapter

Adapter

Persistance

Adapter

GUI

Events

Events

Events

Events

Event Storming

What do you mean by “Event-Driven”?

Martin Fowler

Event NotificationEvent-Carried State TransferEvent SourcingCQRS

https://martinfowler.com/articles/201701-event-driven.html

GeneralProgramming-Model

Method vs.

Event https://www.flickr.com/photos/gen/325927418

Sender ReceiverMessage

Method Call

Sender ReceiverListen

Raise Event

Event

Sender

ReceiverListen

Event

Raise Event Receiver

Listen

Receiver

Listen

https://www.flickr.com/photos/caroslines/547184477

Wiring

Sender

Receiver

Listen

Raise Event

Receiver

Listen

ReceiverListen

Sender

Raise Event

Observer

Sender

Receiver

Listen

Raise Event

Receiver

Listen

Receiver

Listen

Event-BUS

Pub/Sub

Event vs. Method

Method

Sender tells Receiver

Sync

Fixed Coupling

New Receiver: change to Sender

Event

Receiver listens to Sender

Sync / Async

Loose Coupling

New Receiver: no change to Sender

Sometimes: Hard to Test/Debug

Testing?

Winner?https://www.flickr.com/photos/48424574@N07/5096035675

We want you for Kata

http://udoncrew.deviantart.com/art/UFS-Impossible-Contortion-109860059

Try Extremes

TDD

Pair-Programming

https://www.youtube.com/watch?v=8wUOUmeulNs © 2012 Atlassian

Callcenter Kata

0911/123499040/456780171/3456789….

Phone Number / Caller ID

0911/123499040/456780171/3456789….

Phone Number / Caller ID

0911 Nürnberg

040 Hamburg

0911/123499….

040/45678….

0911/123499040/456780171/3456789….

Phone Number / Caller ID

0911 Nürnberg

0911/123499….

040/45678….

Statistik

040 Hamburg

callAgency

localCallcenter„Berlin“

030/12345

Incoming Call040/12345030/12345

...

localCallcenter„Hamburg“

040/12345

statistic

Pure OO

statistic

statistic

Constraints

Method-communicationno Events

Small Classes (SRP) max. 20-30 LOC max. 5 Methods

GO

Event Frameworks

https://www.flickr.com/photos/alebaffa/8939535066

Do It Yourself

Sender

Receiver

Listen

emit Event

Receiver

Listen

Receiver

Listen

Event-BUS

Pub/Sub

Minimal EventFramework

Eventname:String

payload:Object

Busemit(event)

addListener(eventName listener)،

ASenderAReceiver_2listen_1()listen_2()

AReceiver_1listen_1()listen_2()

public class Event {

private String name;private Object payload;

public Event(String name, Object payload) {this.name = name;this.payload = payload;

}public Event(String name) {

this.name = name;}public String getName() {

return name;}public Object getPayload() {

return payload;}

}

Event (Java)

public class ReceiverDemo implements EventListener {public void receive(Event event) {}

…}

EventBus bus = new EventBus();ReceiverDemo receiver1 = new ReceiverDemo();ReceiverDemo receiver2 = new ReceiverDemo();

bus.addListener("SomethingHappened", receiver1);bus.addListener("SomethingHappened", receiver2);bus.emit(new Event("SomethingHappened"));

Basics (Java)

public class ReceiverDemo implements EventListener {public void receive(Event event) {}

…}

int payload = 27;EventBus bus = new EventBus();ReceiverDemo receiver1 = new ReceiverDemo();

bus.addListener("SomethingHappened", receiver1);bus.emit(new Event("SomethingHappened", payload));

Payload (Java)

Basics (JS)

var callback1 = function() { … } var callback2 = function() { … } 

bus.addListener('SomethingHappened', callback1);bus.addListener('SomethingHappened', callback2);bus.emit('SomethingHappened');

Payload (JS)

var callback = function(payload) { ...     });

bus.addListener('SomethingHappened', callback);    bus.emit('SomethingHappened', {bar: 'foo'});

Tests/Specs

1) a_Bus_can_emit_Events

2) a_Receiver_gets_notified

3) multiple_Recivers_get_notified

4) Events_accept_a_Payload

GO

Callcenter Kata

Constraints

no Method-communication, Events only

Constraints

no Method-communication, Events only

Small Classes (SRP) max. 20-30 LOC max. 5 Methods