Event-Driven Architecture ও Message Queue

লেসন ১০ / ৫০

Sync vs Async

Sync (REST, gRPC)Async (Queue)
Caller waitFire-forget
Tight couplingLoose coupling
SimpleEventual 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

RabbitMQKafka
BrokerEvent log + streaming
Consume → deleteRetain, replay
Task queueEvent 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