Mục lục
Event-Driven Architecture: Kiến trúc hướng sự kiện
Cách đây mấy năm, tôi từng bị phân công maintain một hệ thống booking hôm nay đặt hôm tắc cứng như búa. Lý do? Kiến trúc monolithic khổng lồ nơi mọi thứ được gọi đồng bộ.
Khi khách hàng hoàn tất thanh toán, hệ thống phải gọi liên tiếp: cập nhật inventory, tính toán commission cho agent, gửi email confirmation, cập nhật data warehouse cho analytics, và còn vài cái khác nữa. Bất cứ khi nào một dịch vụ downstream chậm (email server bị kém đường mạng chẳng hạn), toàn bộ flow thanh toán sẽ delay. Khách chờ, server chờ, cả team chờ. Những lúc như vậy, tôi hiểu tại sao các tờ rơi quảng cáo nói "xử lý đơn hàng trong 5 giây" lại khó thực hiện đến vậy.
Đó là lúc tôi mới thực sự cần hiểu rõ Event-Driven Architecture — không phải vì buzz word, mà vì thực tế cần có một cách khác.
Đổi chiều suy nghĩ
Thay vì A gọi B gọi C gọi D (và chờ D xong), trong event-driven architecture chúng ta nói: "Khi X xảy ra, hệ thống sẽ phát hành một sự kiện, những dịch vụ nào quan tâm đều có thể lắng nghe."
Khách hoàn tất thanh toán? Phát hành event PaymentCompleted. Email service lắng nghe và gửi email. Inventory service lắng nghe và update stock. Analytics service lắng nghe và thêm dữ liệu. Chúng không biết nhau tồn tại, không cần đợi nhau, tất cả diễn ra gần như đồng thời. Thanh toán được xác nhận ngay — không phụ thuộc vào tốc độ của email server hay bất kỳ dịch vụ nào khác.
Dễ thế thôi. Nhưng khi bạn thực hiện, bạn sẽ gặp phải những bài toán mà lý thuyết không dạy.
Những challenge thực tế
Consistency là cơn ác mộng không có giải pháp hoàn hảo. Trong hệ thống đồng bộ, transaction ACID bảo đảm: thanh toán thành công hoặc không, không bao giờ nằm giữa. Nhưng trong event-driven, khi PaymentCompleted được phát hành, có thể email service xử lý thành công, nhưng inventory service lại fail. Bây giờ khách đã được xác nhận thanh toán nhưng hàng chưa được cập nhật. Dù có cơ chế retry, compensating transactions (rollback), eventual consistency vẫn là nỗi đau.
Chia sẻ bài viết


