📖 English Edition (Bản tiếng Anh)
Điều kiện tiên quyết: Đọc qua Phần 2 — Khi Nào & Tại Sao Cần Chuyển Magento Sang Microservices? để hiểu rõ các điểm nghẽn của cơ sở dữ liệu nguyên khối.
Kiến Trúc Composable Commerce: Vượt Qua Nợ Kỹ Thuật Bằng Chuẩn MACH
Tóm tắt cốt lõi: Kiến trúc Composable MACH phân tách nền tảng thương mại điện tử nguyên khối thành các dịch vụ module độc lập theo 3 tầng chức năng chính: Tầng Giao Dịch Cốt Lõi (Core) gồm Catalog, Giá, Giỏ hàng, Thanh toán và Đơn hàng; Tầng Bổ Trợ (Supporting) gồm Khách hàng, Đánh giá, Khuyến mãi; và Tầng Tiện Ích Chung (Generic) gồm Thông báo, Tìm kiếm và Phân tích số liệu. Việc áp dụng chuẩn thiết kế hướng tên miền (DDD) với ranh giới ngữ cảnh rõ ràng và giao thức nhị phân gRPC Protobuf giúp triệt tiêu hoàn toàn sự phụ thuộc lẫn nhau, tăng tốc độ triển khai tính năng lên 4 lần và giữ độ trễ P99 ổn định dưới 45ms.
Việc phân tách một cơ sở dữ liệu Magento gồm hơn 500 bảng không thể thực hiện theo cảm tính bằng cách cắt ngẫu nhiên các module PHP. Nếu không có phương pháp Thiết Kế Hướng Tên Miền (Domain-Driven Design - DDD) chặt chẽ, các nhóm kỹ sư sẽ vô tình tạo ra một “khối monolith phân tán” (distributed monolith) — gánh trọn sự phức tạp của các lệnh gọi mạng mà không thu được bất kỳ lợi ích mở rộng nào.
1. Bản Đồ Kiến Trúc 21 Dịch Vụ Phân Tách Theo Domain
flowchart TD
subgraph Ingress_Layer ["Tầng Điều Hướng & Cổng Vào API"]
WebStore["Giao Diện Headless (Next.js Storefront)"]
MobileApp["Ứng Dụng Di Động (Flutter)"]
EnvoyIngress["Cổng Envoy Edge Gateway & Chuẩn W3C Trace"]
end
WebStore --> EnvoyIngress
MobileApp --> EnvoyIngress
subgraph Core_Domains ["1. Miền Giao Dịch Cốt Lõi (Go / gRPC)"]
Catalog["Dịch Vụ Catalog (LanceDB + Flat Cache)"]
Pricing["Động Cơ Tính Giá (Redis Cache)"]
Cart["Dịch Vụ Giỏ Hàng & Phiên (Redis Cluster)"]
Inventory["Dịch Vụ Giữ Hàng Tồn Kho (Khóa Phân Tán)"]
Checkout["Bộ Điều Phối Thanh Toán (Saga Coordinator)"]
Order["Dịch Vụ Quản Lý Đơn Hàng (PostgreSQL 16)"]
end
subgraph Supporting_Domains ["2. Miền Bổ Trợ Nghiệp Vụ (Go / Laravel 12)"]
Customer["Dịch Vụ Khách Hàng & Phân Quyền RBAC"]
Promotions["Động Cơ Mã Giảm Giá & Quy Tắc Khuyến Mãi"]
Fulfillment["Tích Hợp Vận Chuyển & Kho Bãi WMS"]
Payment["Bộ Điều Phối Cổng Thanh Toán"]
end
subgraph Data_Sync_Backbone ["3. Xương Sống Đồng Bộ Dữ Liệu"]
Kafka["Luồng Sự Kiện Redpanda / Kafka"]
Debezium["Đồng Bộ CDC Debezium 3.0+"]
MagentoLegacy["Khối Magento 2.4.9 Cũ (Dự Phòng Nóng)"]
end
EnvoyIngress --> Core_Domains
EnvoyIngress --> Supporting_Domains
Core_Domains --> Kafka
Supporting_Domains --> Kafka
MagentoLegacy --> Debezium
Debezium --> Kafka
2. Ma Trận Phân Bổ Ranh Giới Ngữ Cảnh (Bounded Context)
Để ngăn chặn rò rỉ cấu trúc dữ liệu, mỗi microservice sở hữu và quản lý hoàn toàn cơ sở dữ liệu riêng:
| Nhóm Miền | Tên Microservice | Cơ Sở Dữ Liệu Chính | Trách Nhiệm & Ranh Giới Nghiệp Vụ |
|---|---|---|---|
| Cốt Lõi | Catalog Service | LanceDB + PostgreSQL | Quản lý sản phẩm, danh mục, biến thể, vector tìm kiếm hình ảnh |
| Cốt Lõi | Pricing Engine | Redis + RAM Table | Bảng giá theo nhóm khách, quy tắc giá B2B, tính toán thuế VAT |
| Cốt Lõi | Cart Service | Redis Cluster | Quản lý giỏ hàng ẩn danh tốc độ cao, lưu trữ các mục quote |
| Cốt Lõi | Inventory Service | PostgreSQL + Redlock | Theo dõi tồn kho đa kho, giữ hàng lạc quan chống bán khống |
| Cốt Lõi | Checkout Orchestrator | Stateless (Go Runtime) | Điều phối luồng thanh toán Saga, chuyển đổi giỏ hàng sang đơn |
| Cốt Lõi | Order Service | PostgreSQL 16 Partitioned | Vòng đời đơn hàng bất biến, hóa đơn, hoàn tiền, trạng thái giao vận |
| Bổ Trợ | Customer Service | PostgreSQL | Hồ sơ người dùng, sổ địa chỉ, phân cấp tài khoản công ty, JWT |
| Tiện Ích | Notification Service | RabbitMQ / NATS | Gửi email, tin nhắn SMS và webhook phi đồng bộ |
3. Đặc Tả Giao Thức gRPC Protobuf Chuẩn
syntax = "proto3";
package commerce.catalog.v1;
option go_package = "github.com/vesviet/commerce/catalog/v1;catalogv1";
service CatalogService {
rpc GetProductBySKU (GetProductRequest) returns (ProductResponse);
rpc BatchGetPrices (BatchPriceRequest) returns (BatchPriceResponse);
}
message GetProductRequest {
string sku = 1;
string customer_group_id = 2;
string currency_code = 3;
}
message ProductResponse {
string product_id = 1;
string sku = 2;
string name = 3;
int64 base_price_cents = 4;
int64 final_price_cents = 5;
int32 available_stock = 6;
repeated string categories = 7;
map<string, string> custom_attributes = 8;
}
message BatchPriceRequest {
repeated string skus = 1;
string customer_tier_id = 2;
}
message BatchPriceResponse {
map<string, int64> prices_cents = 1;
}
4. Lưới Điều Hướng Envoy Gateway Cho Quá Trình Di Trú Từng Bước
flowchart LR
Client["Yêu Cầu Từ Client"] --> Envoy["Envoy Gateway 1.30+"]
Envoy --> RoutePath{"Khớp Đường Dẫn URL"}
RoutePath -->|"/api/v1/catalog/*"| GoCatalog["Cụm Dịch Vụ Go Catalog (Pod Pool)"]
RoutePath -->|"/api/v1/cart/*"| GoCart["Cụm Dịch Vụ Go Cart (Pod Pool)"]
RoutePath -->|"/api/v1/checkout/*"| GoCheckout["Cụm Dịch Vụ Go Checkout"]
RoutePath -->|"Tuyến Chưa Tách (/admin, /checkout/onepage)"| MagentoMonolith["Magento Monolith (PHP-FPM)"]
style GoCatalog fill:#d5f5e3,stroke:#27ae60,stroke-width:2px
style GoCart fill:#d5f5e3,stroke:#27ae60,stroke-width:2px
style GoCheckout fill:#d5f5e3,stroke:#27ae60,stroke-width:2px
style MagentoMonolith fill:#fadbd8,stroke:#e74c3c,stroke-width:2px
❓ Câu Hỏi Thường Gặp (FAQ)
Khái niệm Bounded Context trong DDD giúp hệ thống không bị biến thành 'monolith phân tán' như thế nào?
Tại sao nên ưu tiên giao thức gRPC cho giao tiếp nội bộ thay vì REST hay GraphQL?
Quy tắc định giá phức tạp của khách hàng B2B được xử lý ra sao khi tách khỏi Magento?
catalogrule_product_price. Khi chuyển sang Go Microservice, toàn bộ logic định giá được cô lập thành một dịch vụ chuyên biệt, tính toán ma trận chiết khấu theo nhóm khách hàng trực tiếp trên bộ nhớ RAM và cấu trúc Redis Hash, trả về giá chính xác trong thời gian dưới 5 mili-giây.🔗 Bước Tiếp Theo: Khám phá chi tiết Phần 4 — Hướng Dẫn Chuyển Đổi Magento Sang Microservices Không Gián Đoạn.
