#architecture
#event-driven
#backend
Kiến trúc Hướng Sự kiện: Xây dựng Hệ thống Reactive
Khám phá các mẫu kiến trúc hướng sự kiện bao gồm event sourcing, CQRS và message queues để xây dựng ứng dụng responsive và có khả năng mở rộng.
2 phút đọc
Mục lục
Tại sao Event-Driven?
Kiến trúc request-response truyền thống hoạt động tốt cho ứng dụng đơn giản. Nhưng khi hệ thống phát triển, chúng trở nên coupled chặt và khó mở rộng. Kiến trúc hướng sự kiện (EDA) cung cấp một hướng tiếp cận khác.
Khái niệm Cốt lõi
Events vs Commands
Một event mô tả điều đã xảy ra. Một command yêu cầu điều gì đó xảy ra.
// Event - thì quá khứ, sự thật bất biến
interface OrderPlaced {
type: "OrderPlaced";
orderId: string;
items: Item[];
timestamp: Date;
}
// Command - mệnh lệnh, có thể bị từ chối
interface PlaceOrder {
type: "PlaceOrder";
items: Item[];
customerId: string;
}
CQRS (Command Query Responsibility Segregation)
Tách biệt read model và write model:
// Write side - xử lý commands
class OrderCommandHandler {
handle(cmd: PlaceOrder) {
const order = Order.create(cmd);
this.eventStore.append(order.events);
}
}
// Read side - tối ưu cho queries
class OrderQueryHandler {
getOrderSummary(orderId: string) {
return this.readDb.query(
"SELECT * FROM order_summaries WHERE id = ?",
[orderId]
);
}
}
Message Queues
Message queues tách biệt producers khỏi consumers:
- Apache Kafka - Throughput cao, dựa trên log
- RabbitMQ - Routing linh hoạt, giao thức AMQP
- Redis Streams - Nhẹ, in-memory
Khi nào nên dùng EDA
Sử dụng kiến trúc hướng sự kiện khi:
- Nhiều service cần phản ứng với cùng một event
- Bạn cần audit trails hoặc time-travel debugging
- Các thành phần có yêu cầu scaling khác nhau
- Bạn muốn decouple các team và service
Tránh sử dụng khi:
- Các thao tác CRUD đơn giản là đủ
- Yêu cầu strong consistency ở mọi nơi
- Team nhỏ và hệ thống đơn giản