📖 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êngGiao 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 ServiceLanceDB + PostgreSQLgRPC GetProduct, SearchCatalogcatalog.product.createdBảng thuộc tính sản phẩm phẳng, danh mục, media
Pricing EngineRedis Hash + RAMgRPC CalculateCartPriceKhô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 ServiceRedis ClustergRPC AddToCart, GetCartcart.abandoned.detectedGiỏ hàng tạm thời, danh sách SKU đã chọn, mã giảm giá
Inventory ServicePostgreSQL + RedlockgRPC ReserveStock, ReleaseStockinventory.stock.depletedSố lượng tồn thực tế theo kho, các lệnh khóa giữ hàng
Checkout OrchestratorStateless (Go)REST POST /v1/checkout/submitKhô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 ServicePostgreSQL 16gRPC CreateOrder, GetOrderorder.confirmed.v1Bản ghi đơn hàng bất biến, hóa đơn, hoàn tiền
Customer ServicePostgreSQLgRPC Authenticate, GetProfilecustomer.registered.v1Mật khẩu băm Argon2id, sổ địa chỉ, tài khoản công ty
Fulfillment ServicePostgreSQLgRPC DispatchShipmentfulfillment.package.shippedMã 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ụ

  1. 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.
  2. 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.
  3. 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?

Dịch vụ tồn kho kết hợp cơ chế kiểm tra phiên bản dòng dữ liệu của PostgreSQL với khóa phân tán Redis Redlock. Khi khách hàng bắt đầu bước thanh toán, số lượng hàng được khóa tạm thời trên bộ nhớ RAM với thời hạn thuê (lease) là 15 phút. Nếu khách hàng không thanh toán hoặc hủy đơn, thời hạn thuê tự hết hạn và số lượng hàng được tự động trả lại kho mà không gây ra bất kỳ hiện tượng nghẽn cơ sở dữ liệu 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?

Sổ địa chỉ của khách hàng được lưu trữ và quản lý độc quyền bởi Dịch Vụ Khách Hàng (Customer Service). Khi khách hàng đặt mua một đơn hàng cụ thể, bộ điều phối thanh toán sẽ lấy địa chỉ đã chọn qua gRPC và tạo một bản sao bất biến (Snapshot) gắn chết vào bản ghi của Dịch Vụ Đơn Hàng (Order Service), đảm bảo rằng nếu sau này khách hàng có sửa đổi địa chỉ trong sổ tay thì lịch sử đơn hàng cũ vẫn không bao giờ bị sai lệch.

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?

Thay vì chạy các câu lệnh SQL nối bảng phức tạp gây chậm hệ thống bán hàng, toàn bộ các dịch vụ đều phát ra các sự kiện biến động trạng thái (đơn hàng mới, tồn kho thay đổi, khách hàng cập nhật) lên Kafka. Một worker phân tích chuyên trách sẽ tiêu thụ luồng sự kiện này và nạp vào kho dữ liệu phân tích ClickHouse hoặc Apache Iceberg dạng cột để phục vụ dashboard báo cáo thời gian thực với tốc độ xử lý hàng triệu dòng/giây.

🔗 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.