Từ lý thuyết đến thực chiến của Event Sourcing: triển khai dịch vụ remote config bằng NestJS
(borntodare.me)Giới thiệu
Bài chia sẻ của anh Won Ji-hyeok về event sourcing tại meetup Server của Danggeun đã giúp tôi hiểu rõ hơn rất nhiều về event sourcing. Tôi đã sắp xếp lại các khái niệm cơ bản của event sourcing và, dựa trên nội dung bài trình bày, thử xây dựng một dịch vụ config đơn giản dựa trên NestJS, TypeScript và MongoDB.
- Bản gốc: Xây dựng nền tảng nội bộ có khả năng mở rộng bằng event sourcing | Danggeun SERVER Meetup #2
- Mã nguồn mẫu cho dịch vụ config dùng event sourcing
Khái niệm cơ bản của event sourcing
- Khác với cách CRUD truyền thống, mọi thay đổi trạng thái đều được ghi lại dưới dạng event bất biến, giúp việc audit trail và rollback trở nên dễ dàng
- Giống như sổ cái kế toán ghi tuần tự mọi giao dịch (event), có thể tái dựng trạng thái hiện tại bất cứ lúc nào
Các thành phần cốt lõi
- Event
- Bao gồm ID duy nhất, thời gian tạo, loại event, thông tin người dùng và nội dung (body), đồng thời đảm bảo tính bất biến và tự đầy đủ
- State
- Trạng thái cuối cùng được tính ra bằng cách phát lại toàn bộ event (có thể dùng snapshot hoặc cache khi cần)
- Reducer
- Là hàm thuần nhận trạng thái trước đó và event làm đầu vào để tính ra trạng thái mới, đồng thời giữ tính bất biến
- Entity
- Gom các event liên quan lại để quản lý như một đối tượng, giúp truy vấn hiệu quả lịch sử thay đổi của một entity cụ thể
Ví dụ triển khai và cấu trúc
- Thiết lập môi trường cơ bản: khởi chạy ứng dụng bằng NestJS
- Định nghĩa entity và event
- Sử dụng interface TypeScript và schema MongoDB để định nghĩa rõ ràng nhiều loại event khác nhau (ví dụ: tạo config, thêm/xóa tham số) cùng với đối tượng trạng thái
- Triển khai reducer:
- Viết các hàm thuần cập nhật trạng thái theo từng loại event để phát lại chuỗi event và tính ra trạng thái cuối cùng
- API endpoint và tầng service
- Triển khai REST API cung cấp các chức năng tạo config, truy vấn, thêm/xóa tham số
- Sử dụng pattern dispatch-commit để lần lượt xử lý việc phát hành event, tính toán trạng thái và lưu event
Nâng cao thêm và tích hợp với hệ thống bên ngoài
- Interface generic
- Thiết kế repository event có thể tái sử dụng để giảm trùng lặp mã và đảm bảo type safety
- Event handler
- Tích hợp với các hệ thống bên ngoài như Slack để thực hiện xử lý bổ sung như gửi thông báo khi event xảy ra
- Chiến lược tối ưu hiệu năng
- Snapshot: lưu trạng thái tại một thời điểm cụ thể rồi chỉ áp dụng các event phát sinh sau đó, giảm chi phí phát lại toàn bộ event
- Caching: dùng cache in-memory hoặc Redis để cung cấp nhanh trạng thái entity được truy vấn thường xuyên
Kết luận
- Event sourcing là một kiến trúc mạnh mẽ giúp tăng độ tin cậy và khả năng bảo trì bằng cách ghi lại rõ ràng toàn bộ lịch sử thay đổi
- Cần áp dụng dần dần phù hợp với domain, kết hợp các chiến lược tối ưu như snapshot và caching để đảm bảo hiệu năng hệ thống, đồng thời cân nhắc kỹ độ dốc học tập trước khi đưa vào sử dụng
1 bình luận
Tốt tốt! ^0^