Multi-tenant: quyết định đầu tiên và khó sửa nhất
Multi-tenancy — nhiều khách hàng dùng chung một hệ thống — có ba cách làm, và chọn sai thì sửa về sau rất tốn kém.
| Cách | Cách ly | Chi phí vận hành | Hợp với |
|---|---|---|---|
| Chung database, chung table, phân biệt bằng cột tenant | Thấp nhất | Thấp nhất | Nhiều khách hàng nhỏ |
| Chung database, mỗi tenant một schema | Trung bình | Trung bình | Vừa phải cả hai chiều |
| Mỗi tenant một database | Cao nhất | Cao nhất | Ít khách hàng lớn, yêu cầu tuân thủ chặt |
Rủi ro lớn nhất của cách thứ nhất là một câu query quên điều kiện lọc theo tenant sẽ để khách hàng này nhìn thấy dữ liệu của khách hàng kia. Cách phòng không phải là cẩn thận hơn, mà là làm cho việc quên trở nên bất khả thi — đặt bộ lọc ở tầng truy cập dữ liệu, hoặc dùng row-level security của PostgreSQL, để không có đường nào viết được một query thiếu điều kiện đó.
Microservices khi nào là đúng
Microservices giải quyết vấn đề tổ chức nhiều hơn vấn đề kỹ thuật. Chúng cho phép nhiều đội làm việc và deploy độc lập với nhau.
Nếu chỉ có một đội, chia nhỏ hệ thống thành mười service thường làm mọi thứ chậm đi: mỗi thay đổi phải sửa nhiều repository, gỡ lỗi phải lần qua nhiều service, và một transaction trải trên bốn service khó hơn nhiều so với một transaction trong một database.
Cách bắt đầu ít rủi ro hơn là một hệ thống đơn khối nhưng có ranh giới module rõ ràng bên trong. Khi một module chứng minh được là nó cần scale riêng hoặc cần đội riêng, tách nó ra. Ranh giới sạch sẵn khiến việc tách sau này không đau.
Sẵn sàng cho production nghĩa là gì
Một nền tảng phục vụ nhiều khách hàng cần những thứ mà sản phẩm nội bộ bỏ qua được.
Cần đo được: log có cấu trúc, metric, và trace để lần theo một request đi qua nhiều service. Khi một khách hàng báo chậm, phải trả lời được chậm ở đâu, chứ không phải đoán.
Cần tách được ảnh hưởng: một khách hàng chạy báo cáo nặng không được làm chậm mọi khách hàng khác. Thường xử lý bằng rate limit theo tenant và hàng đợi riêng cho công việc nặng.
Và cần onboarding tự động. Nếu thêm một khách hàng mới đòi hỏi kỹ sư chạy script bằng tay thì đó chưa phải nền tảng, mới chỉ là một sản phẩm được cài nhiều lần.