9 min read
Event-Driven Architecture & Messaging
Mind Map Summary
- Event-Driven Architecture (EDA)
- Definition: A software architecture paradigm built around the production, detection, consumption of, and reaction to events. It promotes loose coupling and asynchronous communication between services.
- Event: A significant change in state. It’s a fact that something happened (e.g.,
OrderCreated,PaymentProcessed). Events are immutable.
- Key Concepts
- Event Producer/Publisher: The component that generates and sends events to a message broker.
- Event Consumer/Subscriber: The component that receives and processes events from a message broker.
- Message Broker/Bus: An intermediary system that facilitates communication (e.g., Apache Kafka, RabbitMQ, Azure Service Bus).
- Messaging Patterns
- Publish-Subscribe (Pub/Sub): One-to-many communication via “topics.” Multiple subscribers receive a copy of the message.
- Competing Consumers: Many consumers compete to process messages from a single “queue.” Each message is processed by only one consumer.
- Saga Pattern: A sequence of local transactions where each step publishes an event to trigger the next. Failure triggers compensating transactions.
- Event Sourcing: Storing all state changes as a sequence of immutable events rather than just the current state.
- CQRS: Separates update models (commands) from read models (queries).
- Benefits and Challenges
- Pros: Loose coupling, independent scalability, resilience, auditability, and improved responsiveness.
- Cons: Distributed system complexity, eventual consistency, monitoring difficulities, and distributed transaction management.
Core Concepts
EDA fundamentally shifts from direct service-to-service communication to communication via events. The message broker is the central nervous system, ensuring events are reliably delivered. Understanding patterns like Pub/Sub for broadcasting and Competing Consumers for work distribution is key. For maintaining data consistency across services in a distributed environment, the Saga pattern is crucial.
Practice Exercise
Design a system for processing e-commerce orders using an event-driven approach. Whiteboard how events like OrderCreated, PaymentProcessed, and OrderShipped would flow between microservices via a message bus.
Answer (E-commerce Order Processing with EDA)
Scenario
A customer places an order on an e-commerce website. This triggers a series of actions across different microservices:
- Order creation.
- Payment processing.
- Inventory update.
- Shipping.
- Notification to the customer.
Architecture Diagram (Conceptual Whiteboard)
+-----------------+ +-----------------+ +-----------------+
| | | | | |
| Customer | | Order | | Message |
| (Web/Mobile) +-----> Service +-----> Broker |
| | | | | (Kafka/MQ) |
+--------+--------+ +--------+--------+ +--------+--------+
^ | |
| | (Publishes events) |
| | |
| | |
+--------+--------+ +--------v--------+ +--------v--------+
| | | | | |
| Notification | | Payment | | Inventory |
| Service |<----+ Service |<----+ Service |
| | | | | |
+-----------------+ +-----------------+ +-----------------+
^ ^
| (Consumes events) | (Consumes events)
| |
+--------+--------+ +--------+--------+
| | | |
| Shipping | | Analytics |
| Service |<-------------------------------+ Service |
| | | |
+-----------------+ +-----------------+
Event Flow Explanation
- Customer Places Order:
- The Frontend sends a request to the Order Service.
- Order Service (Producer):
- Persists the order locally and publishes an
OrderCreatedevent. - Responds to the Frontend immediately.
- Persists the order locally and publishes an
- Message Broker:
- Routes the
OrderCreatedevent to all interested subscribers.
- Routes the
- Payment Service (Consumer):
- Receives
OrderCreated, initiates payment, and publishesPaymentProcessed.
- Receives
- Inventory Service (Consumer):
- Subscribes to
PaymentProcessed, deducts items, and publishesInventoryUpdated.
- Subscribes to
- Shipping Service (Consumer):
- Subscribes to
InventoryUpdatedand initiates shipping.
- Subscribes to
- Notification Service (Consumer):
- Subscribes to almost all events to keep the user informed.
Key Takeaways from this Design
- Loose Coupling: Each service operates independently. The Order Service doesn’t need to know how payment or inventory is handled.
- Asynchronous Communication: Operations happen in the background, improving the responsiveness.
- Resilience: If the Inventory Service is down, the
PaymentProcessedevent waits in the broker until the service recovers. - Saga Pattern: The flow uses the Saga pattern to manage distributed consistency via compensating events (e.g.,
PaymentFailed).