A lot of people focus on the process instead of the participating entities.
The focus when designing the system should be on the entities (Customer, Payment, Bill, Order, Inventory) instead of the processes (ordering, billing, fulfillment). I summarize that by saying "Nouns over Verbs".
The state of each of the entities is affected by the processes, but the effect happens from changes in other entities, Customers place an Order. Customers get a Bill for the Order, Customers make a Payment, etc.
The states of each of these entities is independent of the others and reacts/changes only as a result of two things, either an external "Command", or an "Event".
Commands are events that occur outside of the system boundary, usually visible as part of an API (if RESTful) that uses POST/PUT/DELETE or they are imperatives from one entity to another.
Commands are imperatives, Place Order, Pay Bill, Fulfill Order, etc.
Events are records of occurrences in the system, expressed in the past tense and are immutable. Order Placed, Bill Paid, Order Fulfilled.
Customers place an Order by POSTing to /orders (or potentially /customers/uuid/orders).
Events are generated from entities inside the system. (Order being placed generates an order_placed event).
The difference is that by focussing on the entities, and their state, independent of other entities, the entities can be created, tested, installed, evolved independently of other entities in the system.
The thinking about them is simplified and focussed, they are naturally decoupled because they can only find out about other entities by inquiring or affect other entities by generating a Command or an Event.
Any events they generate are processed asynchronously and can have multiple consumers.
The focus when designing the system should be on the entities (Customer, Payment, Bill, Order, Inventory) instead of the processes (ordering, billing, fulfillment). I summarize that by saying "Nouns over Verbs".
The state of each of the entities is affected by the processes, but the effect happens from changes in other entities, Customers place an Order. Customers get a Bill for the Order, Customers make a Payment, etc.
The states of each of these entities is independent of the others and reacts/changes only as a result of two things, either an external "Command", or an "Event".
Commands are events that occur outside of the system boundary, usually visible as part of an API (if RESTful) that uses POST/PUT/DELETE or they are imperatives from one entity to another.
Commands are imperatives, Place Order, Pay Bill, Fulfill Order, etc.
Events are records of occurrences in the system, expressed in the past tense and are immutable. Order Placed, Bill Paid, Order Fulfilled.
Customers place an Order by POSTing to /orders (or potentially /customers/uuid/orders).
Events are generated from entities inside the system. (Order being placed generates an order_placed event).
The difference is that by focussing on the entities, and their state, independent of other entities, the entities can be created, tested, installed, evolved independently of other entities in the system.
The thinking about them is simplified and focussed, they are naturally decoupled because they can only find out about other entities by inquiring or affect other entities by generating a Command or an Event.
Any events they generate are processed asynchronously and can have multiple consumers.