📖 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ềnTên MicroserviceCơ Sở Dữ Liệu ChínhTrách Nhiệm & Ranh Giới Nghiệp Vụ
Cốt LõiCatalog ServiceLanceDB + PostgreSQLQuản lý sản phẩm, danh mục, biến thể, vector tìm kiếm hình ảnh
Cốt LõiPricing EngineRedis + RAM TableBảng giá theo nhóm khách, quy tắc giá B2B, tính toán thuế VAT
Cốt LõiCart ServiceRedis ClusterQuản lý giỏ hàng ẩn danh tốc độ cao, lưu trữ các mục quote
Cốt LõiInventory ServicePostgreSQL + RedlockTheo dõi tồn kho đa kho, giữ hàng lạc quan chống bán khống
Cốt LõiCheckout OrchestratorStateless (Go Runtime)Điều phối luồng thanh toán Saga, chuyển đổi giỏ hàng sang đơn
Cốt LõiOrder ServicePostgreSQL 16 PartitionedVò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 ServicePostgreSQLHồ sơ người dùng, sổ địa chỉ, phân cấp tài khoản công ty, JWT
Tiện ÍchNotification ServiceRabbitMQ / NATSGử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?

Bounded Context thiết lập ranh giới sở hữu dữ liệu tuyệt đối: không một microservice nào được phép đọc hoặc ghi trực tiếp vào cơ sở dữ liệu của microservice khác. Mọi giao tiếp liên miền bắt buộc phải thông qua các hợp đồng giao thức gRPC có quản lý phiên bản hoặc qua luồng sự kiện Kafka, triệt tiêu hoàn toàn các ràng buộc khóa ngoại (foreign keys) ẩn ngầm.

Tại sao nên ưu tiên giao thức gRPC cho giao tiếp nội bộ thay vì REST hay GraphQL?

Giao thức nhị phân gRPC Protobuf chạy trên nền HTTP/2 cho tốc độ thực thi nhanh hơn từ 7 đến 10 lần so với định dạng JSON của REST, đồng thời giảm tới 80% băng thông mạng nhờ nén dữ liệu nhị phân và ghép kênh kết nối. Trong khi GraphQL rất tuyệt vời cho việc tổng hợp dữ liệu ở tầng giao diện người dùng (BFF), thì gRPC là tiêu chuẩn vàng cho giao tiếp giữa các vi dịch vụ ở backend.

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?

Trong Magento, việc tính giá B2B phải chạy qua hàng loạt phép nối bảng nặng nề trên bảng 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.