Skip to content

Chiến lược Multi-Tenancy

Trạng thái: Draft · Ngày: 2026-05-22 · Chủ trì: Phat Nguyen (PM/PO) Quyết định kỹ thuật đi kèm: ADR-0001 Các mức cô lập multi-tenancy.

Trang này ghi lại chúng ta muốn gì ở multi-tenancy và vì sao. Phần làm như thế nào nằm trong ADR.

Bài toán

BANA phục vụ nhiều doanh nghiệp (Organizer) trên cùng một nền tảng. Hiện mọi tenant dùng chung service và chung một database (nx_seller), chỉ phân biệt bằng cột merchantId / organizerId lọc ở tầng ứng dụng — tức mô hình Pool. Khi số lượng tenant và độ đa dạng hợp đồng tăng lên, một mô hình duy nhất không còn hợp với tất cả:

  • SMB đại trà cần chi phí/tenant rẻ nhất có thể.
  • Khách lớn / enterprise có thể đòi cô lập dữ liệu, tài nguyên riêng, hoặc thậm chí deploy on-prem.
  • Ta phải có khả năng di chuyển tenant giữa các mô hình khi nhu cầu thay đổi — gồm cả chiều khó: gộp một tenant riêng biệt trở về nền tảng chung.

Mục tiêu

Biến mức cô lập thành thuộc tính theo từng Organizer, quyết định lúc chạy — không phải lựa chọn cứng một lần cho cả hệ thống. Mặc định mọi tenant ở mức rẻ nhất; nâng cấp từng Org khi cần; vẫn giữ đường quay về.

Đơn vị cô lập (tenant boundary)

Đơn vị cô lập là Organizer (Org) — một Org cùng toàn bộ Merchant con (chi nhánh) di chuyển như một khối. organizerId là khóa phân vùng.

Ba mức (góc nhìn sản phẩm)

MứcKhách nhận được gìChi phíBán cho
POOL (mặc định)Chung service + chung DB; tách biệt logicThấp nhấtSMB, đại trà
BRIDGEChung service + DB riêng mỗi OrgTrung bìnhKhách cần cô lập dữ liệu
SILOService + DB riêng mỗi Org (namespace/stack riêng)Cao nhấtEnterprise, on-prem, hợp đồng đặc thù

Ánh xạ chuẩn ngành (AWS SaaS Lens): Pool / Bridge / Silo. BANA hiện đang chạy Pool.

Yêu cầu

#Yêu cầuMức
R1Org mới onboard tức thì vào POOL, không cần provisionPOOL
R2Org nâng cấp POOL → BRIDGE → SILO mà không đổi URL client hay code nghiệp vụtất cả
R3Org hạ cấp SILO → POOL (gộp về) với dữ liệu merge an toàntất cả
R4Dữ liệu tenant mang ID toàn cục duy nhất để merge không bao giờ trùngnền tảng
R5Org "ồn ào"/nặng ở mức cao không ảnh hưởng Org khácBRIDGE, SILO
R6Một đường migrate schema chạy được cho mọi mứcnền tảng
R7Vệ sinh DB dài hạn: cleanup, split, merge có runbook lặp lại đượcnền tảng

Tiêu chí thành công

  • [ ] Mức cô lập là một trường của Org, mặc định POOL.
  • [ ] Di chuyển Org giữa các mức là runbook có tài liệu, không phải dự án riêng mỗi lần.
  • [ ] Không thể trùng ID merchantId/organizerId khi gộp SILO về POOL.
  • [ ] Thêm Org mới vào POOL không cần thao tác hạ tầng nào.

Câu hỏi mở (cần chốt trước khi Accepted)

Câu hỏiTrạng tháiẢnh hưởng
Thị trường mục tiêu chính — SMB hay enterprise?Nghiêng hybrid, còn thăm dòQuyết định mức đầu tư SILO ngay bây giờ có đáng không
Ràng buộc compliance / data-residency / on-prem?Chưa xác địnhNếu có → SILO + Helm chart portable thành bắt buộc, không còn tùy chọn
BRIDGE là mức cố định hay chỉ là trạm trung chuyển sang SILO?MởQuyết định có xây trọn tooling cho BRIDGE không
Dùng Postgres Row-Level Security hay giữ lọc tầng app?MởTư thế bảo mật của mức POOL

Ngoài phạm vi

  • Thiết kế lại ca/cash-session (theo dõi riêng, đang bàn với nhân viên).
  • Feature flag / tùy biến theo tenant ngoài phạm vi cô lập.

Thuật ngữ

Thuật ngữÝ nghĩa
Org / OrganizerTenant cấp cao nhất; chứa N Merchant
MerchantĐơn vị kinh doanh / chi nhánh thuộc một Org
Tenant RegistryBảng tra: orgId → { isolationTier, datasourceRef }
Connection ResolverLớp chọn đúng kết nối DB theo tenant lúc chạy
Snowflake IDID 64-bit toàn cục duy nhất; enabler để merge tenant an toàn

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.