← ~/blog

Event-Driven Architecture là gì? 3 mô hình cơ bản cho người mới

· 9 min read · System Architecture

Giải thích kiến trúc hướng sự kiện bằng ví dụ đơn hàng: Event Notification, Event-Carried State Transfer, Event Sourcing, và cách chọn giữa Redis, RabbitMQ, Kafka.

1. Khi nào nên dùng Event-Driven Architecture (EDA)?

Khi hệ thống có số lượng service phụ thuộc lẫn nhau tăng lên, các lời gọi API HTTP đồng bộ (Synchronous HTTP calls) sẽ gây nên hiện tượng Cascading Latency (độ trễ dây chuyền).

EDA giải quyết vấn đề này bằng cách cho phép producer và consumer hoàn toàn độc lập về mặt thời gian (temporal decoupling).


2. Event-Carried State Transfer trong thực tế

Thay vì chỉ gửi { "orderId": 123 }, event sẽ mang theo toàn bộ dữ liệu đơn hàng cần thiết:

json
{
  "eventId": "evt_998877",
  "eventType": "ORDER_CREATED",
  "timestamp": "2026-06-25T10:30:00Z",
  "payload": {
    "orderId": "123",
    "userId": "usr_456",
    "totalAmount": 1500000,
    "items": [
      { "productId": "prod_1", "quantity": 2 }
    ]
  }
}

3. Lựa chọn Message Broker: Redis vs Kafka vs RabbitMQ

  • Redis Pub/Sub & Streams: Phù hợp khi cần độ trễ thấp và triển khai đơn giản, ví dụ notification hoặc chat. Pub/Sub không lưu lại tin nhắn, nên dùng Streams nếu không được phép mất event.
  • RabbitMQ: Hỗ trợ định tuyến tin nhắn linh hoạt (Topic / Direct / Fanout Exchange) và work queue.
  • Apache Kafka: Phù hợp cho luồng dữ liệu lớn (stream processing) và khi cần lưu log sự kiện lâu dài để đọc lại.

Ảnh bìa: "Inside event-driven architectures" từ EDA Visuals của David Boyne.

Bình luận