📖 English Edition (Bản tiếng Anh)
Điều kiện tiên quyết: Đọc qua Phần 10 — Xác Định Phạm Vi Dự Án Magento & Bảng Giá Agency Tại Việt Nam để nắm bức tranh phân bổ nguồn lực.
Bóc Tách Chi Tiết Hệ Sinh Thái: Đặc Tả Dịch Vụ Theo Từng Domain
Tóm tắt cốt lõi: Việc phân rã mô hình dữ liệu nguyên khối của Magento sang các microservices Go hiệu năng cao đòi hỏi thiết lập ranh giới ngữ cảnh (Bounded Context) chuẩn mực theo phương pháp Thiết Kế Hướng Tên Miền (DDD) trên 8 miền nghiệp vụ cốt lõi: Catalog & Tìm Kiếm, Động Cơ Định Giá, Giỏ Hàng & Phiên, Khóa Tồn Kho, Điều Phối Thanh Toán, Quản Lý Đơn Hàng, Khách Hàng & Phân Quyền, và Tích Hợp Vận Chuyển. Việc thực thi nguyên tắc cách ly cơ sở dữ liệu tuyệt đối kết hợp API nhị phân gRPC Protobuf và sự kiện Kafka phi đồng bộ giúp triệt tiêu hoàn toàn hiện tượng khóa chéo cơ sở dữ liệu và duy trì độ trễ P99 ổn định dưới 35ms.
Trong một hệ thống nguyên khối như Magento, ranh giới dữ liệu giữa các phòng ban thường bị xóa nhòa. Một lập trình viên có thể dễ dàng viết một câu lệnh SQL nối bảng khách hàng, bảng kho và bảng đơn hàng trong cùng một truy vấn.
Khi chuyển đổi sang microservices phân tán, sự ràng buộc chằng chịt này bắt buộc phải bị chặt đứt. Mỗi dịch vụ miền nghiệp vụ phải trở thành cơ quan quyền lực duy nhất quản lý dữ liệu của chính mình.
1. Bản Đồ Phân Rã 8 Miền Nghiệp Vụ Cốt Lõi
flowchart TD
subgraph Client_Interaction ["Tầng Cổng Vào Người Dùng"]
BFF["Cổng API Gateway / BFF Tổng Hợp"]
end
subgraph Domain_Services ["8 Dịch Vụ Miền Nghiệp Vụ Độc Lập"]
BFF --> Catalog["1. Dịch Vụ Catalog (LanceDB / PG)"]
BFF --> Pricing["2. Động Cơ Tính Giá (Redis RAM)"]
BFF --> Cart["3. Dịch Vụ Giỏ Hàng (Redis Cluster)"]
BFF --> Inventory["4. Dịch Vụ Khóa Tồn Kho (Redlock + PG)"]
BFF --> Checkout["5. Điều Phối Thanh Toán (Saga Engine)"]
BFF --> Order["6. Dịch Vụ Đơn Hàng (PostgreSQL 16)"]
BFF --> Customer["7. Dịch Vụ Khách Hàng (PostgreSQL)"]
BFF --> Fulfillment["8. Dịch Vụ Giao Vận (Kafka Sync)"]
end
subgraph Event_Mesh ["Xương Sống Sự Kiện Phi Đồng Bộ Kafka"]
Catalog -.->|"catalog.product.updated"| Kafka["Cụm Redpanda / Kafka"]
Inventory -.->|"inventory.stock.reserved"| Kafka
Order -.->|"order.created.v1"| Kafka
Order -.->|"order.cancelled.v1"| Kafka
Kafka -.-> Fulfillment
Kafka -.-> Pricing
end
2. Đặc Tả Chi Tiết 8 Dịch Vụ & Quyền Sở Hữu Dữ Liệu
| Tên Vi Dịch Vụ | Cơ Sở Dữ Liệu Riêng | Giao Thức Đầu Vào Đồng Bộ | Sự Kiện Phát Ra Phi Đồng Bộ | Dữ Liệu Nghiệp Vụ Quản Lý |
|---|---|---|---|---|
| Catalog Service | LanceDB + PostgreSQL | gRPC GetProduct, SearchCatalog | catalog.product.created | Bảng thuộc tính sản phẩm phẳng, danh mục, media |
| Pricing Engine | Redis Hash + RAM | gRPC CalculateCartPrice | Không có (Lắng nghe sự kiện) | Bảng giá theo nhóm đại lý, quy tắc chiết khấu, thuế |
| Cart Service | Redis Cluster | gRPC AddToCart, GetCart | cart.abandoned.detected | Giỏ hàng tạm thời, danh sách SKU đã chọn, mã giảm giá |
| Inventory Service | PostgreSQL + Redlock | gRPC ReserveStock, ReleaseStock | inventory.stock.depleted | Số lượng tồn thực tế theo kho, các lệnh khóa giữ hàng |
| Checkout Orchestrator | Stateless (Go) | REST POST /v1/checkout/submit | Không có (Điều khiển Saga) | Máy trạng thái thanh toán tạm thời, mã token thanh toán |
| Order Service | PostgreSQL 16 | gRPC CreateOrder, GetOrder | order.confirmed.v1 | Bản ghi đơn hàng bất biến, hóa đơn, hoàn tiền |
| Customer Service | PostgreSQL | gRPC Authenticate, GetProfile | customer.registered.v1 | Mật khẩu băm Argon2id, sổ địa chỉ, tài khoản công ty |
| Fulfillment Service | PostgreSQL | gRPC DispatchShipment | fulfillment.package.shipped | Mã vận đơn đối tác 3PL, trạng thái bàn giao bưu tá |
3. Đặc Tả Hợp Đồng gRPC: Quản Lý Khóa Tồn Kho Phân Tán
Đoạn hợp đồng Protobuf dưới đây kiểm soát việc giữ hàng tồn kho tạm thời với thời hạn tự hủy (TTL) nhằm chống bán khống trong các đợt flash sale:
syntax = "proto3";
package commerce.inventory.v1;
option go_package = "github.com/vesviet/commerce/inventory/v1;inventoryv1";
service InventoryService {
rpc ReserveStock (ReserveStockRequest) returns (ReserveStockResponse);
rpc ReleaseStock (ReleaseStockRequest) returns (ReleaseStockResponse);
rpc CommitStock (CommitStockRequest) returns (CommitStockResponse);
}
message ReserveStockRequest {
string order_id = 1;
repeated StockItem items = 2;
int64 ttl_seconds = 3; // Thời gian giữ hàng (ví dụ 900 giây để thanh toán)
}
message StockItem {
string sku = 1;
int32 quantity = 2;
string warehouse_id = 3;
}
message ReserveStockResponse {
bool success = 1;
string reservation_id = 2;
repeated string out_of_stock_skus = 3;
}
message ReleaseStockRequest {
string reservation_id = 1;
}
message ReleaseStockResponse {
bool released = 1;
}
message CommitStockRequest {
string reservation_id = 1;
string order_id = 2;
}
message CommitStockResponse {
bool committed = 1;
}
3. Quy Trình Phối Hợp gRPC Khi Checkout Đạt Tải Đỉnh
Sơ đồ tuần tự dưới đây mô tả cách thức các microservices Go trao đổi dữ liệu qua giao thức gRPC non-blocking trong suốt quá trình hoàn tất đơn hàng:
sequenceDiagram
autonumber
participant Gateway as Envoy API Gateway / BFF
participant Cart as Dịch Vụ Giỏ Hàng (Go)
participant Pricing as Bộ Máy Định Giá
participant Inventory as Dịch Vụ Tồn Kho (Go)
participant Payment as Dịch Vụ Cổng Thanh Toán
participant Order as Dịch Vụ Đơn Hàng (PostgreSQL)
participant Kafka as Apache Kafka Event Bus
Gateway->>Cart: ValidateCart(CartID)
Cart-->>Gateway: Danh Sách Sản Phẩm & CustomerID
Gateway->>Pricing: CalculateTotal(CartItems, CustomerTier)
Pricing-->>Gateway: Giá Sau Thuế & Chiết Khấu
Gateway->>Inventory: ReserveStock(ReservationID, Items)
Inventory-->>Gateway: Đã Khóa Tồn Kho (TTL 15 Phút)
Gateway->>Payment: AuthorizePayment(Số Tiền, Token)
Payment-->>Gateway: Đã Xác Thực Thanh Toán
Gateway->>Order: CreateOrder(OrderPayload)
Order->>Kafka: Phát Sự Kiện OrderCreated (Transactional Outbox)
Order-->>Gateway: Xác Nhận Đơn Hàng Thành Công (OrderID)
4. Các Bất Biến Giao Tiếp Giữa Các Dịch Vụ
- Tuyệt Đối Không Truy Vấn Chéo Cơ Sở Dữ Liệu: Không một dịch vụ nào được cấp quyền truy cập vào cơ sở dữ liệu riêng của dịch vụ khác.
- Phân Tách Đọc và Ghi (CQRS): Các luồng đọc dữ liệu khổng lồ (trang danh sách sản phẩm) được phục vụ trực tiếp từ bộ nhớ đệm LanceDB và Redis, hoàn toàn không chạm vào các bảng PostgreSQL giao dịch.
- Tiêu Thụ Sự Kiện Bất Biến (Idempotency): Mọi consumer đọc sự kiện Kafka đều lưu trữ mã định danh sự kiện (Event UUID) trong Redis với thời gian 24 giờ để tự động loại bỏ các sự kiện gửi trùng lặp.
❓ Câu Hỏi Thường Gặp (FAQ)
Hệ thống ngăn chặn hiện tượng bán vượt tồn kho (Overselling) trong các đợt Flash Sale như thế nào?
Địa chỉ giao hàng của khách hàng được quản lý ở đâu trong kiến trúc mới này?
Làm thế nào để xuất các báo cáo doanh thu tổng hợp mà không cần nối bảng giữa các microservices?
🔗 Bước Tiếp Theo: Khám phá Phần 12 — Kiểm Thử Kỹ Sư Go Tại Việt Nam Cho Dự Án Di Trú Magento.
