Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Practical DDD: Bounded Contexts + Events => Mic...

Indu Alagarsamy
September 19, 2019

Practical DDD: Bounded Contexts + Events => Microservices

Domain Driven Design and Messaging go hand in hand, like a warm chocolate brownie paired with vanilla ice-cream! DDD is a software discipline that allows you to move faster and write high-quality code. The whole point is to align the software you write to be flexible with the business changes. When you start to use the technology of messaging to communicate between clean and well-defined bounded contexts you get to remove temporal coupling. And voila, you now have microservices that are built for autonomy from the ground up. Sounds perfect?

In this talk, discover this intersection of DDD as a software discipline with messaging as a technology counterpart. Build reliable systems that can scale with the business changes.

Indu Alagarsamy

September 19, 2019
Tweet

More Decks by Indu Alagarsamy

Other Decks in Design

Transcript

  1. Product Name Description Product Images List Price Shipping Options Stock

    Availability Customer Reviews Dimensions @indu_alagarsamy
  2. Sales Inventory Shipping WHAT IS A PRODUCT ? It’s a

    thing that has a description, images, price It’s a thing that is either available or not It’s a thing that has weight and dimensions that needs to be packaged @indu_alagarsamy
  3. Product Name Description Product Images List Price Shipping Options Stock

    Availability Customer Reviews Dimensions @indu_alagarsamy Do you need transactional consistency for updating the description and the stock availability?
  4. Sales Inventory Shipping Description Product Images List Price Stock Availability

    Shipping Options SPLIT THE MODEL ACCORDING TO TEAMS OR DEPARTMENTS Dimensions Product Product Product Dimensions @indu_alagarsamy
  5. SPLIT THE MODEL ACCORDING TO BUSINESS PROCESSES @indu_alagarsamy Get $70

    off instantly: Pay $0.00 upon approval for the Amazon Prime Rewards Visa card Get it tomorrow. Order within 1hr 53 mins and choose One-Day Shipping at checkout
  6. WHEN an aircraft type is changed: Passenger gets notified with

    a new booking proposal Passenger can cancel flight Passenger can accept proposed booking @indu_alagarsamy
  7. Mycenae, Greece A Business Process can be triggered by an

    event from a different bounded context AircraftTypeHasChanged FLIGHT PLANNING BOUNDED CONTEXT BOOKING BOUNDED CONTEXT WHEN an aircraft type is changed @indu_alagarsamy
  8. Mycenae, Greece Multiple messages can take part in a business

    process AircraftTypeHasChanged NotifyCustomer RebookFlight BookingWasCancelled @indu_alagarsamy FLIGHT PLANNING BOUNDED CONTEXT BOOKING BOUNDED CONTEXT
  9. Flight planning context Booking context MODELING USING EVENT STORMING @indu_alagarsamy

    Aircraft type has changed Booked Flight Was Changed Booking was confirmed Booking was cancelled
  10. EVENT STORMING @indu_alagarsamy Aircraft type was changed Rebook Flight Booked

    Flight Was Changed Notify customer about flight change Request time out (5 days) Booking was confirmed Booking was cancelled
  11. Booking Context AircraftType Was Changed class AircraftTypeWasChangedHandler : IHandleMessages <AircraftTypeWasChanged>

    { Handle(AircraftTypeWasChanged msg, MessageHandlerContext context) { // Find all the relevant booking references context.Send(new RebookFlight{…}); } }
  12. Booking Context RebookFlight class RebookFlightHandler : IHandleMessages<RebookFlight> { Handle(RebookFlight msg,

    MessageHandlerContext context) { // Find a good proposed route context.Publish(new BookedFlightWasChanged{…}); } }
  13. Booking Context BookedFlight WasChanged Booking WasCancelled Cancellation GracePeriodElapsed public class

    BookingChangePolicy : Saga<BookingChangePolicyData>, IAmStartedByMessages<BookedFlightWasChanged>, IAmStartedByMessages<BookingWasCancelled>, IHandleTimeouts<CancellationGracePeriodElapsed> @indu_alagarsamy
  14. @indu_alagarsamy Aircraft type was changed Rebook Flight Booked Flight Was

    Changed Notify customer about flight change Booking was confirmed Booking was cancelled Passenger gets notified with a new booking proposal Propose Rebooking Rebooking Was Proposed Notify customer about proposed rebooking Request time out (5 days) Rebooking was accepted
  15. public class BookingChangePolicy : Saga<BookingChangePolicyData>, IAmStartedByMessages<BookedFlightWasChanged>, IAmStartedByMessages<BookingWasCancelled>, IHandleTimeouts<CancellationGracePeriodElapsed> class GracePeriodForAcceptingRebookings

    : Saga<GracePeriodForAcceptingRebookingsData>, IAmStartedByMessages<RebookingWasProposed>, IAmStartedByMessages<BookingWasCancelled>, IHandleTimeouts<CancellationGracePeriodElapsed> HEALTHY OBSESSION WITH LANGUAGE @indu_alagarsamy
  16. public class AircraftTypeWasChanged { public OldAircraftId {get; set;} } MAKE

    MESSAGES IMMUTABLE @indu_alagarsamy Get rid of the public setters Set the properties at construction time
  17. WHEN Aircraft type is changed: Passenger gets notified with a

    new booking proposal Passenger can cancel flight Passenger can accept proposed booking @indu_alagarsamy Only applies to passengers who are flying business class or first or Platinum loyalty
  18. @indu_alagarsamy Talk to domain experts. Event storm with them. Models

    are not perfect Evolve and refactor with an obsession for domain language Strive for Autonomy. Use events to communicate between bounded contexts