Upload
carlos-buenosvinos
View
579
Download
2
Embed Size (px)
Citation preview
INTEGRATING BCPHP DUTCH 2016 #DPC16
@BUENOSVINOS /GOODWINES/
TEXT
REAL EXAMPLES WRITTEN IN PHP SHOWCASING DDD ARCHITECTURAL STYLES, TACTICAL DESIGN, AND BOUNDED CONTEXT INTEGRATION
foreword by Matthias Noback https://leanpub.com/ddd-in-php
START
E-COMMERCE
FRAUD
GAMIFICATION
SYNC / ASYNC REST / MESSAGING
TIPS WHEN DEALING WITH DOMAIN EVENTS
DDD ARCHITECTURAL STYLES TRIP
SPAGUETTI
FRAMEWORK
HEXAGONAL
HEXAGONAL + CQRS
CQRS + ES
START FIRING DOMAIN EVENTS NOW
TIP #1
DOMAIN EVENTS ARE THING THAT HAPPEN IN OUR DOMAIN THAT DOMAIN EXPERTS CARE ABOUT
Vaughn Vernon
DEFINITION
DOMAIN EVENT INTERFACE
LOG IN ATTEMPTED DOMAIN EVENT
PUBLISHING DOMAIN EVENTS
OUR DOMAIN EVENT PUBLISHER
DO SOMETHING SIMPLE WITH THE EVENTS
TIP #2
DOMAIN EVENT SUBSCRIBER INTERFACE
LOG DOMAIN EVENTS INTO ELASTICSEARCH WITH MONOLOG
REGISTER YOUR NEW LISTENER/SUBSCRIBER
PERSIST ALL YOUR DOMAIN EVENTS IN YOUR MAIN STORAGE (DB)TIP #3
…WHEN A NEW APPLICATION ARRIVES
YOU CAN REPLAY ALL THOSE EVENTS AGAINST THE NEW APPLICATION TO LOADED WITH ALL THE INFO…
SUBSCRIBER TO PERSIST ALL DOMAIN EVENTS
LISTENER TO PERSIST ALL DOMAIN EVENTS
EVENT STORE BASED IN DOCTRINE
EVENTS IN THE DATABASE
PERSIST DOMAIN EVENTS IN THE SAME TX AS DOMAIN CHANGESTIP #4
A USER CHANGES HIS EMAILEMAILWASUPDATED
POSSIBLE SCENARIOS
Not notifying about something that happened :(
Notifying about something that do NOT happened :((
CHANGES TO YOUR DOMAIN AND DOMAIN EVENTS SUCCESS OR FAIL AT THE SAME TIME
TOGETHER
PROVIDE A REST API FOR YOUR DOMAIN EVENTS
TIP #5
…IF IT LOOSES A DOMAIN EVENT
ANOTHER APP CAN SYNC ITS STATUS WITH YOUR EVENTS API
API EVENTS ENDPOINT
API EVENTS ENDPOINT RESULT
KEEP TRACK OF LAST PUBLISHED DOMAIN EVENT
TIP #6
PUBLISHING EVENTS
SPREADING EVENTS
EVENT STORE AND MESSAGE TRACKER
USE SUPERVISORD TO CONSUME BATCH OF LIMITED DOMAIN EVENTSTIP #7
CONSUMING DOMAIN EVENTS
TEXT
USE SUPERVISOR TO FIRE WORKERS AND KEEP THEM RUNNING
USE SUPERVISOR TO FIRE WORKERS AND KEEP THEM RUNNING
USE TACTICIAN OR OTHER COMMAND BUSES
TIP #8
FROM MESSAGE TO AN COMMAND HANDLER
IF USING SYMFONY PHP-AMQPLIB/RABBITMQ-BUNDLE AND LEAGUE/TACTICIAN-BUNDLE
PROTECT YOURSELF FROM DUPLICATE MESSAGES WITH IDEMPOTENCETIP #9
TEXT
TREAT YOUR DOMAIN EVENTS AS YOUR REST API
TIP #10
DOCUMENT YOUR DOMAIN EVENTS AS YOU WOULD DO WITH YOUR REST API
USE SAMI, FOR EXAMPLE
VERSION YOUR DOMAIN EVENTS
WRAP-UP
WRAP-UP
INTEGRATING BOUNDED CONTEXT TIPS
▸ Integration strategies: Messaging (Async) over REST (Sync)
▸ Start firing Domain Events from deeper in your Model as possible
▸ Add simple listeners in your bootstrapping (Elastic + Kibana)
▸ Persist Domain Events into your main storage in the same Tx as Domain changes
▸ Provide an API endpoint for your Domain Events so other apps can get in sync
▸ Publish your Domain events to a Messaging System (RabbitMQ) and keep track of the last messages sent
▸ Protect yourself with Idem Potent operations