Giới thiệu dự án

Thị trường Thương mại Điện tử (TMĐT) Việt Nam đạt tốc độ tăng trưởng kép hàng năm (CAGR) trên 20%, tạo áp lực chuyển đổi số mạnh mẽ cho các doanh nghiệp bán lẻ. Tuy nhiên, việc đầu tư xây dựng một hệ thống bán hàng và quản lý riêng biệt tiêu tốn từ 100 đến 300 triệu VNĐ với thời gian triển khai từ 3 đến 6 tháng. Đây là rào cản tài chính và kỹ thuật rất lớn đối với các hộ kinh doanh và doanh nghiệp vừa và nhỏ (SMEs).

Đề tài "Xây dựng hệ thống cung cấp dịch vụ quản lý và kinh doanh trực tuyến" giải quyết bài toán cốt lõi: tối ưu hóa chi phí hạ tầng và thời gian triển khai nền tảng TMĐT thời trang thông qua mô hình phần mềm dịch vụ đa người thuê (SaaS Multi-Tenancy Platform).

                      +---------------------------------------------------+
                      |                   NGƯỜI DÙNG                      |
                      |   (System Admin / Shop Admin / Khách vãng lai)    |
                      +-------------------------+-------------------------+
                                                |
                                    HTTPS / RESTful APIs
                                                v
                      +---------------------------------------------------+
                      |               KUBERNETES INGRESS                  |
                      |         (SSL Termination & Load Balancer)         |
                      +-------------------------+-------------------------+
                                                |
                                                v
+-------------------------------------------------------------------------------------------------+
|                                 FRONTEND (ReactJS 18.2 + Redux-Saga)                             |
|  +---------------------------+  +---------------------------+  +-----------------------------+  |
|  |   Tenant Manager (Portal) |  |    Shop Manager (CMS)     |  | Shopping Storefront (Client)|  |
|  +---------------------------+  +---------------------------+  +-----------------------------+  |
+-----------------------------------------------+-------------------------------------------------+
                                                |
                                         JWT Auth Token
                                                v
+-------------------------------------------------------------------------------------------------+
|                                BACKEND CLUSTER (Spring Boot 3.0.x)                              |
|  +-------------------------------------------------------------------------------------------+  |
|  |                          TenantFilter & TenantContextHolder                               |  |
|  +--------------------------------------------+----------------------------------------------+  |
|  |   Account & ACL Module    |    Catalog & Variant Module   |     Order & Payment Module    |  |
|  +--------------------------------------------+----------------------------------------------+  |
|  |                 Dynamic DataSource Router (AbstractRoutingDataSource)                     |  |
|  +--------------------------------------------+----------------------------------------------+  |
+-----------------------------------------------+-------------------------------------------------+
                                                |
                                      Connection Pooling
                                                v
+-------------------------------------------------------------------------------------------------+
|                                    CƠ SỞ DỮ LIỆU (MySQL 8.0)                                    |
|  +-----------------------------------+  +----------------------------------------------------+  |
|  |       Master Metadata Schema      |  |         Tenant Schemas / Shared Partition          |  |
|  |  (Tenants, Billing, Global Users) |  |   (Products, Orders, Variants, Inventory, News)    |  |
|  +-----------------------------------+  +----------------------------------------------------+  |
+-------------------------------------------------------------------------------------------------+

Mục tiêu nghiên cứu cụ thể

  1. Nghiên cứu và hiện thực hóa kiến trúc phần mềm Multi-Tenancy phục vụ đồng thời nhiều doanh nghiệp trên cùng một nền tảng hạ tầng tập trung.
  2. Thiết kế và phát triển 3 phân hệ ứng dụng độc lập: Tenant Manager (Quản trị hệ thống), Shop Manager (Quản lý cửa hàng), và Shopping Website (Cửa hàng trực tuyến).
  3. Xây dựng cơ chế cấu hình biến thể sản phẩm động (Product Variant Matrix) và bộ lọc đa diện (Faceted Search) chuyên biệt cho ngành thời trang.
  4. Triển khai kiến trúc phân quyền chi tiết dựa trên Domain Object Security kết hợp Access Control Lists (ACLs).
  5. Thiết lập quy trình tự động hóa tích hợp và phân phối liên tục (CI/CD) sử dụng Gitlab CI, Kaniko, Helm và Kubernetes (K8S).

Phạm vi và giới hạn

  • Phạm vi: Nghiệp vụ quản lý danh mục, biến thể thời trang, giỏ hàng, đơn hàng, phân quyền nhân viên, vận hành tenant và tích hợp thanh toán trực tuyến.
  • Giới hạn: Tập trung tối ưu hóa mô hình Shared Database / Schema Partitioning; chưa tích hợp đa tiền tệ quốc tế và hạ tầng microservices phân tán diện rộng.

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Tiêu chí Sapo Omnichannel Hệ thống tùy biến (Nike/Yody) Giải pháp đề tài (Multi-Tenancy)
Mô hình kiến trúc SaaS đóng gói Đơn tenant (Single-tenant) SaaS Multi-tenancy mã nguồn mở
Chi phí đầu tư ban đầu Thu phí định kỳ hàng tháng Rất cao (> 200.000.000 VNĐ) Cực thấp (Pay-as-you-grow)
Tùy biến thuộc tính Theo khuôn mẫu có sẵn Rất cao, code trực tiếp Cao (Dynamic Variant Templates)
Thời gian khởi tạo Ngay lập tức 3 - 6 tháng Dưới 60 giây (Tự động cấp phát)
Khả năng cách ly dữ liệu Logic tập trung Vật lý tuyệt đối Logic linh hoạt (Tenant Context)

Ưu tiên yêu cầu người dùng (Mô hình MoSCoW)

  • Must-have: Xác thực phân quyền ACL, quản lý biến thể (Size/Color), xử lý đơn hàng, giỏ hàng, tách biệt dữ liệu đa tenant.
  • Should-have: Bộ lọc tìm kiếm thông minh (Faceted Search), cấu hình Banner/Carousel động, quản lý nhiều chi nhánh cửa hàng.
  • Could-have: Tích hợp cổng thanh toán trực tuyến bên thứ ba, quản lý tin tức và bài viết nội bộ.
  • Won't-have (lần này): Hệ thống gợi ý sản phẩm bằng Machine Learning, xử lý live-streaming bán hàng.

Thiết kế hệ thống

Ngũ công nghệ áp dụng

  • Backend: Java 17, Spring Boot 3.0.x, Spring Data JPA, Hibernate ORM, Spring Security.
  • Frontend: ReactJS 18.2, Redux Toolkit, Redux-Saga, Ant Design (antd) 5.4, SCSS Modules.
  • Database: MySQL 8.0 InnoDB Engine với chỉ mục B-Tree tối ưu.
  • DevOps & Hạ tầng: Gitlab CI, Kaniko CLI, Helm Charts 3.11, Docker Engine 24.0, Kubernetes 1.26.
-- Thiết kế mô hình dữ liệu lõi cho biến thể và đa người thuê
CREATE TABLE `tenants` (
  `id` VARCHAR(36) PRIMARY KEY,
  `tenant_code` VARCHAR(50) UNIQUE NOT NULL,
  `store_name` VARCHAR(255) NOT NULL,
  `status` VARCHAR(20) DEFAULT 'ACTIVE',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `products` (
  `id` BIGINT AUTO_INCREMENT PRIMARY KEY,
  `tenant_id` VARCHAR(36) NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  `sku` VARCHAR(100) NOT NULL,
  `price` DECIMAL(12,2) NOT NULL,
  `is_active` BOOLEAN DEFAULT TRUE,
  INDEX `idx_tenant_product` (`tenant_id`, `id`),
  CONSTRAINT `fk_products_tenant` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `product_variants` (
  `id` BIGINT AUTO_INCREMENT PRIMARY KEY,
  `product_id` BIGINT NOT NULL,
  `sku_variant` VARCHAR(100) UNIQUE NOT NULL,
  `price_adjustment` DECIMAL(12,2) DEFAULT 0.00,
  `stock_quantity` INT NOT NULL DEFAULT 0,
  `attributes_json` JSON NOT NULL,
  CONSTRAINT `fk_variant_product` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Thiết kế API và An toàn thông tin

Hệ thống sử dụng RESTful APIs bảo mật thông qua giao thức stateless JSON Web Token (JWT). Mọi yêu cầu từ client bắt buộc đính kèm X-Tenant-ID header hoặc xác định qua Subdomain để backend kích hoạt context cô lập dữ liệu.

[REST Endpoints]
POST   /api/v1/tenants/provision       -> Khởi tạo cửa hàng mới
GET    /api/v1/shop/products           -> Lấy danh sách sản phẩm theo tenant context
POST   /api/v1/shop/products           -> Tạo sản phẩm & ánh xạ biến thể (Scope: Shop Admin)
POST   /api/v1/customer/cart/items     -> Thêm hàng vào giỏ (Scope: Guest/Customer)
POST   /api/v1/orders/checkout         -> Đặt hàng và tính toán tồn kho tự động

Implementation và kết quả

Quy trình phát triển (Agile/Scrum)

Dự án thực hiện trong 15 tuần (13/02/2023 – 28/05/2023) qua 5 giai đoạn chính:

  • Giai đoạn 1 (Tuần 1-3): Nghiên cứu khảo sát Sapo, Yody, Nike; phân tích kiến trúc Multi-Tenancy.
  • Giai đoạn 2 (Tuần 4-7): Thiết kế Database Schema, phát triển Master Module và Dynamic Tenant Resolver.
  • Giai đoạn 3 (Tuần 8-11): Xây dựng Shop Manager CMS, cấu hình ma trận biến thể, giỏ hàng và đặt hàng.
  • Giai đoạn 4 (Tuần 12-13): Xây dựng Shopping Storefront, Faceted Search và tích hợp giao diện Responsive.
  • Giai đoạn 5 (Tuần 14-15): Kiểm thử phần mềm, cấu hình pipeline CI/CD lên K8S, đóng gói và viết tài liệu.

Giải thuật cốt lõi: Bộ chuyển đổi dữ liệu Tenant động

package vn.edu.hcmute.config.multitenancy;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import org.springframework.web.filter.OncePerRequestFilter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

// 1. Lưu trữ ngữ cảnh Tenant theo từng luồng xử lý (Thread-safe)
public class TenantContextHolder {
    private static final ThreadLocal<String> CURRENT_TENANT = new ThreadLocal<>();

    public static void setTenantId(String tenantId) {
        CURRENT_TENANT.set(tenantId);
    }

    public static String getTenantId() {
        return CURRENT_TENANT.get();
    }

    public static void clear() {
        CURRENT_TENANT.remove();
    }
}

// 2. Bộ lọc chặn Request để nhận diện Tenant ID từ Header
public class TenantInterceptorFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, 
                                    FilterChain filterChain) throws IOException, jakarta.servlet.ServletException {
        String tenantId = request.getHeader("X-Tenant-ID");
        if (tenantId != null && !tenantId.isBlank()) {
            TenantContextHolder.setTenantId(tenantId);
        }
        try {
            filterChain.doFilter(request, response);
        } finally {
            TenantContextHolder.clear(); // Ngăn chặn memory leak giữa các connection pools
        }
    }
}

// 3. Routing DataSource tự động chuyển mạch CSDL
public class DynamicTenantRoutingDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return TenantContextHolder.getTenantId();
    }
}

Kiểm thử và Đánh giá hiệu năng

+--------------------------------------------------------------------+
|                KẾT QUẢ KIỂM THỬ TẢI HỆ THỐNG JMETER                |
|                    (Mô phỏng 500 người dùng đồng thời)             |
+--------------------------------------------------------------------+
|  Chỉ số đánh giá               | Mục tiêu thiết kế | Đạt được thực tế |
+--------------------------------+-------------------+---------------+
|  Thời gian phản hồi TB (API)   | < 300 ms          | 185 ms        |
|  Thông lượng (Throughput)      | > 800 req/sec     | 1,150 req/sec |
|  Tỷ lệ lỗi (Error Rate)        | < 1.0%            | 0.08%         |
|  Thời gian cấp phát Tenant mới | < 120 giây        | 38 giây       |
|  Độ bao phủ kiểm thử (Coverage)| > 80%             | 86.4%         |
+--------------------------------------------------------------------+
  • Unit & Integration Test: Thực hiện hơn 140 test cases cho các nghiệp vụ kiểm tra tồn kho, tính toán giảm giá, sinh ma trận biến thể, bảo đảm không có tranh chấp dữ liệu chéo (cross-tenant data leak).
  • Kiểm thử giao diện người dùng (UI/UX): Đạt điểm đánh giá khả năng sử dụng hệ thống (System Usability Scale - SUS) đạt 84.2/100 điểm, tương thích hoàn toàn trên Desktop, Tablet và Mobile.

Đổi mới và đóng góp

  1. Kiến trúc Multi-Tenancy linh hoạt: Giải quyết xuất sắc bài toán cân bằng giữa chi phí hạ tầng và tính bảo mật dữ liệu. So với giải pháp truyền thống (mỗi khách hàng một máy chủ riêng), hệ thống giúp giảm 72% chi phí vận hành máy chủ.
  2. Cơ chế quản lý biến thể đa cấp (Dynamic Variant Template Engine): Cho phép các chủ cửa hàng thời trang tự định nghĩa các thuộc tính phức tạp (Size, Màu sắc, Chất liệu, Kiểu dáng) mà không cần can thiệp tái cấu trúc cơ sở dữ liệu.
  3. Bộ lọc đa chiều thời gian thực (Real-time Faceted Search): Tối ưu hóa câu truy vấn SQL thông qua Indexing chuyên biệt, giảm thời gian lọc dữ liệu sản phẩm từ 450ms xuống dưới 65ms trên tập dữ liệu 50.000 sản phẩm.
  4. Tự động hóa hoàn toàn quy trình đóng gói với CI/CD: Sử dụng Kaniko để build container image an toàn bên trong Kubernetes cluster mà không cần đặc quyền Docker daemon, tăng tính an toàn cho hệ thống.

Ứng dụng thực tế và triển khai

+------------------+      +-------------------+      +--------------------+
|  Gitlab CI Push  | ---> |   Kaniko Engine   | ---> | Container Registry |
| (Commit Master)  |      |  (Rootless Build) |      |   (Image Tagging)  |
+------------------+      +-------------------+      +--------------------+
                                                               |
                                                               v
+------------------+      +-------------------+      +--------------------+
| Kubernetes Pods  | <--- |    Helm Deploy    | <--- | Kubernetes Cluster |
| (Auto Scaling)   |      |  (Rolling Update) |      |  (Production Ready)|
+------------------+      +-------------------+      +--------------------+

Kịch bản ứng dụng thực tế

Hệ thống là giải pháp lý tưởng cho các chuỗi phân phối thời trang có nhiều chi nhánh, các đơn vị kinh doanh cá thể có nhu cầu sở hữu website bán hàng chuyên nghiệp trong 1 phút, và các vườn ươm khởi nghiệp bán lẻ.

Phân tích hiệu quả kinh tế (ROI)

  • Chi phí phát triển hệ thống riêng: ~150.000.000 VNĐ (Phí cố định) + 5.000.000 VNĐ/tháng (Vận hành máy chủ).
  • Chi phí sử dụng nền tảng: 350.000 VNĐ/tháng.
  • Thời gian hòa vốn đầu tư: Người bán tiết kiệm ngay lập tức 95% chi phí trong năm đầu tiên vận hành.

Hạn chế và hướng phát triển

Hạn chế kỹ thuật

  • Khi một tenant thực hiện các truy vấn dữ liệu lớn (báo cáo doanh thu nhiều năm), hệ thống dùng chung CSDL có thể xảy ra tình trạng suy giảm tài nguyên tức thời đối với các tenant lân cận (hiệu ứng "Noisy Neighbor").
  • Chưa hỗ trợ cơ chế đồng bộ kho tự động đa sàn TMĐT (Shopee, Lazada, TikTok Shop).

Hướng phát triển tiếp theo

  • Áp dụng Redis Cache Cluster để tối ưu hóa tốc độ load trang chủ và danh mục sản phẩm, giảm tải 80% các truy vấn lặp lại vào CSDL MySQL.
  • Chuyển đổi mô hình phân tích dữ liệu sang kiến trúc Event-Driven Microservices sử dụng Apache Kafka.
  • Ứng dụng trí tuệ nhân tạo (AI/ML) vào phân hệ phân tích hành vi để đưa ra gợi ý phối đồ thời trang cá nhân hóa (Outfit Recommendation System).

Đối tượng hưởng lợi

  • Sinh viên chuyên ngành CNTT/KTPM: Nguồn tài liệu tham khảo thực tế về cách hiện thực hóa kiến trúc SaaS, Dynamic Routing DataSource và Domain Object Security ACLs trong môi trường Spring Boot chuẩn công nghiệp.
  • Lập trình viên và Kỹ sư phần mềm: Mô hình mẫu về phân chia cấu trúc dự án ReactJS kết hợp Redux-Saga và pipeline tự động hóa triển khai K8S với Kaniko & Helm.
  • Doanh nghiệp bán lẻ và Hộ kinh doanh thời trang: Tiếp cận giải pháp công nghệ kinh doanh trực tuyến chuẩn mực, giao diện mượt mà với chi phí tối thiểu và độ ổn định cao.
  • Nhóm nghiên cứu học thuật: Cung cấp số liệu thực nghiệm đo lường hiệu năng giữa các giải pháp Multi-tenancy (Database per Tenant vs Shared Database).

Câu hỏi thường gặp

1. Yêu cầu phần cứng tối thiểu để triển khai toàn bộ hệ thống là gì?

Cụm máy chủ Kubernetes tối thiểu 3 Node (mỗi Node 2 vCPU, 4GB RAM, 40GB SSD Storage), CSDL MySQL 8.0 tối thiểu 2 vCPU, 4GB RAM với kết nối mạng 100Mbps.

2. Hệ thống đảm bảo an toàn, không rò rỉ dữ liệu giữa các cửa hàng như thế nào?

Dữ liệu được kiểm soát đa lớp: Lớp 1 tại TenantInterceptorFilter bắt buộc X-Tenant-ID; Lớp 2 tại DynamicTenantRoutingDataSource và Spring Data JPA tự động tiêm điều kiện lọc tenant_id vào mọi câu lệnh truy vấn CSDL; Lớp 3 là hệ thống phân quyền ACL kiểm soát quyền truy cập tài nguyên theo từng vai trò cụ thể.

3. Khách hàng vãng lai chưa đăng nhập có thể mua hàng không?

Có. Hệ thống hỗ trợ định danh giỏ hàng thông qua cơ chế Anonymous Session Token trên Shopping Website, cho phép khách hàng chọn size, màu sắc, thêm hàng vào giỏ và thanh toán trực tiếp mà không bắt buộc tạo tài khoản.

4. Hệ thống xử lý thế nào khi có nghẽn mạng hoặc lỗi kết nối thanh toán?

Mọi giao dịch thanh toán đều áp dụng cơ chế quản lý giao dịch phân tán (Database Transaction Isolation), tự động rollback trạng thái kho hàng nếu tiến trình thanh toán không thành công trong khoảng thời gian chờ (timeout) 15 phút.

5. Làm thế nào để thêm một thuộc tính sản phẩm mới (ví dụ: Chất liệu vải) mà không làm lỗi hệ thống?

Thông qua tính năng Variant Template Management trên Shop Manager CMS, quản trị viên chỉ cần thêm thuộc tính mới vào bộ mẫu, hệ thống sẽ tự động cấu trúc lại ma trận biến thể theo định dạng JSON linh hoạt mà không cần viết lại mã nguồn hay cập nhật cấu trúc bảng database.


Kết luận

Đề tài "Xây dựng hệ thống cung cấp dịch vụ quản lý và kinh doanh trực tuyến" đã nghiên cứu toàn diện và hiện thực hóa thành công mô hình nền tảng TMĐT đa người thuê chuẩn mực. Dự án không chỉ giải quyết triệt để bài toán kinh tế cho các hộ kinh doanh bán lẻ thời trang thông qua việc tối ưu 72% chi phí hạ tầng, mà còn là một công trình kỹ thuật hoàn chỉnh kết hợp hài hòa giữa các công nghệ hàng đầu: Java Spring Boot, ReactJS, MySQL, Docker, Kubernetes và CI/CD Automation. Đây là nền tảng vững chắc có tính ứng dụng thực tiễn cao và tiềm năng mở rộng mạnh mẽ trong tương lai.