Sync vs Async
| Sync (REST, gRPC) | Async (Queue) |
|---|---|
| Caller wait | Fire-forget |
| Tight coupling | Loose coupling |
| Simple | Eventual consistency |
EDA
OrderService → "OrderCreated" → [Bus]
↓
EmailService InventoryService Analytics
RabbitMQ ⭐
- AMQP, Exchange → Queue → Consumer
- Routing: Direct, Topic, Fanout
- ACK, durable queue, DLQ
channel.exchange_declare(exchange="orders", type="topic")
channel.basic_publish("orders", "order.created", json.dumps(order))
Kafka
- Distributed streaming
- Topic → Partition → offset
- Persistent log, replay possible
- Millions msg/sec
RabbitMQ vs Kafka
| RabbitMQ | Kafka |
|---|---|
| Broker | Event log + streaming |
| Consume → delete | Retain, replay |
| Task queue | Event streaming |
CQRS ⭐
Read DB ←sync← Write DB ↑ ↓ GetOrders CreateOrder
Event Sourcing
// Append events, replay → state
INSERT Events VALUES (1, "AccountOpened", {balance: 0});
INSERT Events VALUES (2, "Deposited", {amount: 1000});
balance = 0 + 1000 = 1000
সুবিধা: audit trail, time travel। অসুবিধা: complex query, snapshot ব্যবহার।
Saga Pattern ⭐
Distributed transaction = compensating transactions sequence।
Choreography
Order → "Created" → Inventory → "Reserved"
→ Payment → "Failed"
Inventory ← "Release"
Order ← "Cancel"
Orchestration
Orchestrator: 1. Inventory.Reserve() 2. Payment.Charge() 3. Fail → compensate
Outbox Pattern
BEGIN TX; INSERT Orders ...; INSERT Outbox (event, payload); COMMIT; // Worker picks Outbox, publishes to broker