A practical lesson on notification-style events, including when they preserve useful decoupling and when they quietly recreate callback-heavy integration.
Event notification is the lightest event-driven integration pattern. The producer tells the rest of the system that something happened, but does not try to publish the full state needed by every consumer. That can be a strong choice when downstream systems only need a trigger or when the producer should remain narrow in what it exposes. It becomes weaker when most consumers immediately call back to the producer for details.
The pattern is attractive because it keeps the event contract small. The trade-off is that it often preserves data dependency at runtime. If five consumers all react to order.placed by calling the order service for the same details, the architecture is asynchronous at transport level but still tightly coupled at availability level.
sequenceDiagram
participant O as Order Service
participant B as Broker
participant F as Fulfillment
participant A as Analytics
O->>B: Publish order.placed
B-->>F: order.placed
B-->>A: order.placed
F->>O: Fetch order details
A->>O: Fetch order details
What to notice:
Notification works well when:
This often fits cache invalidation, simple audit signals, or workflows where the consumer already owns enough context locally.
The pattern starts to degrade when:
At that point, the system may need event-carried state transfer, a projection, or a dedicated read model instead of pure notification.
1{
2 "eventName": "order.placed",
3 "eventId": "evt_0184",
4 "data": {
5 "orderId": "ord_441"
6 }
7}
This is a valid notification event. The question is whether orderId is enough for consumers to act locally, or whether it only triggers a second dependency chain.
Even when the payload is small, notification is not contract-free. Consumers still depend on:
This is why a notification event should be intentionally narrow, not vague. A thin payload is useful only if it still identifies a clear business fact.
A team publishes invoice.ready notifications with only invoiceId. Six downstream services immediately call the billing service for amount, currency, due date, and customer details. What should you challenge first?
Challenge whether notification is the right integration pattern for this interaction. The repeated callback behavior suggests the event is too thin for the actual consumer needs, and the architecture may still be tightly coupled to billing-service availability.