Mục tiêu
Cung cấp tài liệu tham khảo cho cấp độ Senior, ánh xạ các mẫu kiến trúc phần mềm (Clean Architecture, Microservices, Event-Driven, CQRS) với các quyết định thiết kế SQL Server (bố cục schema, multi-tenancy, tính nhất quán dữ liệu, chiến lược migration).
1. Clean Architecture / Onion
- Mỗi Bounded Context một Database (hoặc Schema) – mỗi module cốt lõi sở hữu một schema riêng (ví dụ:
dbo,sales,inventory). - Schema theo Layer không được khuyến khích; thay vào đó hãy nhóm các bảng theo domain.
- Migrations: Sử dụng EF Core migrations hoặc SQLPackage để quản lý phiên bản schema. Lưu trữ script migration trong thư mục
Database/Migrations/. - Chiến lược Backup: Full backup hàng tuần + differential hàng ngày + transaction-log mỗi 15 phút. Lưu trữ backup trong Azure Blob với chính sách immutable (không thể thay đổi).
- Ví dụ:
sql
CREATE SCHEMA sales; CREATE TABLE sales.Customers ( Id UNIQUEIDENTIFIER PRIMARY KEY, Name NVARCHAR(200) NOT NULL, Email NVARCHAR(200) NOT NULL UNIQUE, CreatedAt DATETIME2 DEFAULT SYSUTCDATETIME() );
2. Microservices (Database per Service)
- Cách ly (Isolation): Mỗi microservice có một SQL Database riêng (hoặc Elastic Pool) – loại bỏ việc khóa chéo cơ sở dữ liệu (cross-service locking).
- Sao chép dữ liệu (Data Replication): Sử dụng Transactional Replication hoặc Change Data Capture (CDC) + Azure Data Factory để đồng bộ hóa read-models.
- Backup: Azure SQL Managed Instance – khôi phục theo thời điểm (PITR) được bật theo mặc định. Đối với on-prem, bật Log Shipping đến region phụ.
- Ví dụ – Service
Ordersở hữu DBOrders; ServiceCustomersở hữu DBCustomers. Truy vấn chéo service thực hiện thông qua API hoặc Đồng bộ hướng sự kiện (Event-driven sync).
3. Event-Driven Architecture (Kiến trúc hướng sự kiện)
- Event Store dạng Append-only: Lưu các event domain vào một bảng duy nhất
EventStore.Eventsvới các cột (EventId,AggregateId,EventType,Payload,CreatedAt). - Projection DB: Xây dựng các bảng read-model (
OrderReadModel) sử dụng Azure Functions hoặc SQL Server Change Tracking. - Backup: Do event store là append-only, bật tính năng lưu trữ dài hạn (long-term retention - ví dụ 7 năm) sử dụng Azure Blob Archive.
- Ví dụ:
sql
CREATE TABLE EventStore.Events ( EventId UNIQUEIDENTIFIER PRIMARY KEY, AggregateId UNIQUEIDENTIFIER NOT NULL, EventType NVARCHAR(100) NOT NULL, Payload NVARCHAR(MAX) NOT NULL, CreatedAt DATETIME2 DEFAULT SYSUTCDATETIME() );
4. CQRS (Command‑Query Responsibility Segregation)
- Write Model (Mô hình Ghi): Bảng chuẩn hóa kèm theo các ràng buộc (constraints), stored procedures cho quy tắc nghiệp vụ.
- Read Model (Mô hình Đọc): Phi chuẩn hóa, sử dụng column-store (tối ưu cho mệnh đề
ORDER BY) hoặc Azure Synapse cho tính toán phân tích. - Đồng bộ hóa: Sử dụng SQL Server Service Broker hoặc CDC + Azure Data Factory để đẩy các thay đổi từ hệ thống OLTP sang OLAP.
- Backup: Phân tách các chính sách backup – OLTP (backup log tần suất cao) vs OLAP (full backup hàng tuần).
- Ví dụ – Bảng Write
Orders+ Read viewvw_OrderSummary.
5. Các mẫu Multi‑Tenant
| Mẫu cài đặt (Pattern) | Mức độ cách ly | Ưu điểm | Nhược điểm |
|---|---|---|---|
| Cơ sở dữ liệu riêng rẽ | Vật lý | Tính bảo mật cao, dễ dàng mở rộng, backup tách biệt. | Chi phí cao, quản lý được chuỗi kết nối lớn. |
| Chia sẻ DB, Schema tách biệt | Logic | Chi phí vừa phải, dễ dạng truy vấn giữa các thành phần khác nhau. | Đòi hỏi quản lý schema phức tạp. |
| Chia sẻ DB, chia sẻ bảng bằng cột phân biệt TenantId | Mức dòng (Row) | Chi phí tối thiểu nhất, kết cấu đơn giản. | Phải định nghĩa Row-Level Security (RLS) để cô lập, cực kỳ cẩn trọng khi indexing. |
Các mẹo thực hành cài đặt
- Kích hoạt Row-Level Security nếu ứng dụng cài đặt thiết kế chia sẻ bảng
shared-table:sqlCREATE SECURITY POLICY TenantFilter ADD FILTER PREDICATE dbo.fn_TenantPredicate(TenantId) ON dbo.Orders; - Tuỳ ứng linh động cài đặt Elastic Pools cho các thiết kế tenant database nhỏ để chia sẻ nguồn cấp (resources).
6. Checklist cho Backup & Restore
- Full Backup – hàng tuần, gửi vào bộ lưu trữ ngoài (geo-redundant storage).
- Differential Backup – thực hiện song song (hàng ngày).
- Transaction Log Backup – mỗi 15 phút (hoặc giảm xuống 5 phút nếu RPO đòi hỏi cực căng).
- Test Restore – Định kỳ hàng quý (quarterly drills) thực hiện các bước point-in-time test trả file test lên một hệ thống sandbox khác.
- Chính sách Retention Policy – lưu log backup khoảng 30 ngày, full backup là 90 ngày. Đẩy các bản ghi cũ lên kho Archive.
7. Các định hướng Data-Lake & ETL Integrations (Tích hợp)
- Landing Zone: Dành ra các thư mục root như folder thuộc phân vùng của Azure Data Lake Gen2. Ví dụ:
raw/<source>/->raw/onprem_sql/. - Ingestion: Tiến trình lấy dữ liệu dùng ứng phó Azure Data Factory - tính năng Copy Activity qua một máy chủ local Self-hosted IR chuyên trách push pull các nguồn CDC changes.
- Transformation (Biến đổi): Thiết đặt Synapse Spark (hay Azure Databricks) hỗ trợ việc cleansing, enrich tính toán lại model & writes chèn trả ngược ra Azure Synapse DW (
hoặc SQL DW). - Orchestration: Mạch pipeline xử lý thuộc nền tảng ADF liên hợp bắt các schedules hay trigger thuộc luồng event grids theo mỗi tập files đổ xuống zone trên.
- Ví dụ: Dùng kết nối incremental copy queries thông qua khoá chốt bảng
Source:SELECT * FROM dbo.Customers WHERE ModifiedDate > @Watermark.
8. Case Study – Xử lý (Ingestion) khối lượng Order tăng đột ngột
- Kịch bản: Lên chốt 200k orders mỗi giờ. Cần cài đặt bảo đạm đường truyền write-latency độ chênh mini-giây và update báo cáo analytics qua hệ thống Real-Time.
- Thiết kế:
- Cấu hình Write DB – Lập Managed Instance ở phân khúc Azure SQL qua định dạng partition tách bảng
Ordersbảng cho từng đơn thông qua mãOrderDate. - Bật cờ CDC – thiết lập cờ enabled với đối tượng bảng
Orders. - Giải pháp ADF – copy tiến trình cập nhật mới (CDC changes) lên thư mục của Data Lake định kỳ ngắt quãng 5 phút.
- Lớp Data Synapse – truy quét qua bảng Materialized view
vw_OrderStatscài mặc định làm tươi cứ mỗi hút. - Đăng ký Backup – Giám sát lưu bằng PITR, bổ túc chèn lệnh nighty full-backup lưu định kỳ tới phân tệp Blob.
- Cấu hình Write DB – Lập Managed Instance ở phân khúc Azure SQL qua định dạng partition tách bảng
- Kết quả: Gần như không ghi độ trễ thiết đặt cài schema, analytic system cực nhạy phân bổ chính xác tính chốt RPO/RTO theo luật công ty.
Các tài liệu được lưu lại ở thư mục SQL Deep-Dive - chuyên trang hệ thống thông tin Wiki senior.