Files
cn-ui/specs/archive/High_Level_Design.md

8.4 KiB

Tài liệu Thiết kế Tổng quan (High-Level Design - HLD)

Hệ thống Event-Driven Loyalty & Rewards

1. Tổng quan Hệ thống (System Overview)

Mục tiêu: Xây dựng một nền tảng Loyalty linh hoạt, hiệu năng cao, dựa trên kiến trúc hướng sự kiện (Event-Driven). Hệ thống có khả năng xử lý song song các giao dịch tài chính (cộng/trừ điểm) an toàn tuyệt đối và theo dõi hành vi người dùng (tracking) ở tần suất cao mà không gây nghẽn luồng xử lý giao dịch cốt lõi.

Đối tượng và Hệ thống liên quan:

  • Actors (Người dùng): Khách hàng (Member) sử dụng ứng dụng di động/web; Nhân viên đối tác (Merchant) sử dụng ứng dụng quét mã.
  • External Systems (Hệ thống ngoài): Hệ thống phát hành thẻ (Card Issuance), Hệ thống gửi tin (SMS/Email/Firebase).

2. Sơ đồ Kiến trúc Tổng quan (Architecture Topology)

Hệ thống được chia thành các phân lớp (layers) rõ ràng nhằm đảm bảo tính độc lập, dễ bảo trì và dễ dàng mở rộng.

  • Client Layer: Các ứng dụng tương tác trực tiếp với người dùng cuối (Member App, Merchant App).
  • Event Gateway Layer: event-processor-service đóng vai trò là "Smart Router", chịu trách nhiệm tiếp nhận, validate và phân loại sự kiện (Direct, Tracking, Notification) để định tuyến vào đúng Kafka Topic.
  • Core Service Layer:
    • transaction-service: Core Engine đảm bảo tính ACID, xử lý giao dịch điểm/voucher và thực thi Rule logic.
    • attribute-service: Quản lý thuộc tính động (EAV) và các bộ đếm (Counter), tích lũy sự kiện để tránh dội tải cho Core Engine.
    • notification-service: Chuyên biệt cho việc gửi thông báo đa kênh.
    • marketing-service: Chạy cronjob, scheduler cho các chiến dịch và tập khách hàng.
    • customer-service: Quản lý hồ sơ người dùng.
  • Message Broker Layer: Sử dụng Apache Kafka làm xương sống giao tiếp bất đồng bộ, chia thành các topic chuyên biệt (events-topic, tracking-topic, noti-topic).
  • Data & Caching Layer: CSDL quan hệ (PostgreSQL) độc lập cho từng service, Cache (Redis) hỗ trợ truy xuất nhanh.
graph TD
    subgraph Client Layer
        MA[Member App]
        MRA[Merchant App]
    end

    subgraph Event Gateway Layer
        EP[event-processor-service<br/>Smart Router]
    end

    subgraph Message Broker Layer
        K_ET[Kafka: events-topic]
        K_TT[Kafka: tracking-topic]
        K_NT[Kafka: noti-topic]
    end

    subgraph Core Service Layer
        TP[transaction-service<br/>Core Rule & Ledger]
        ATTR[attribute-service<br/>Tracking & Counter]
        NS[notification-service<br/>Push/SMS]
        MKT[marketing-service<br/>Scheduler]
    end

    subgraph Data & Caching Layer
        DB_TP[(PostgreSQL<br/>Transaction)]
        DB_ATTR[(PostgreSQL<br/>EAV/Attribute)]
        REDIS[(Redis<br/>Cache)]
    end

    MA -->|Events: Login, View, Redeem| EP
    MRA -.->|Sync API: Scan Voucher| TP
    
    EP -->|Direct Events| K_ET
    EP -->|Tracking Events| K_TT
    EP -->|Noti Events| K_NT

    K_ET --> TP
    K_TT --> ATTR
    K_NT --> NS
    
    MKT -->|Cron: Scheduled Events| EP
    ATTR -->|Threshold Reached Trigger| K_ET
    TP -->|Reward Result| K_NT
    
    TP --- DB_TP
    ATTR --- DB_ATTR
    ATTR -.-> REDIS

3. Luồng dữ liệu & Tương tác chính (Key Workflows & Sequence)

3.1. Luồng "Accumulate & Trigger" - Tracking & Thưởng (Ví dụ: View Item)

Mô tả: Nhằm tránh làm nghẽn Core Engine bởi các sự kiện có tần suất cao, hệ thống sử dụng Attribute Service để đếm (Counter). Chỉ khi đạt ngưỡng quy định (Threshold), một sự kiện trả thưởng mới được sinh ra và đẩy cho Core Engine xử lý.

sequenceDiagram
    participant MA as Member App
    participant EP as Event Processor
    participant K_TT as Kafka (tracking-topic)
    participant ATTR as Attribute Service
    participant K_ET as Kafka (events-topic)
    participant TP as Transaction Service

    MA->>EP: Gửi Event (VD: ViewItem)
    EP->>EP: Phân loại: Tracking Event
    EP->>K_TT: Đẩy vào tracking-topic
    K_TT->>ATTR: Consume Event
    
    ATTR->>ATTR: 1. Cập nhật Counter (weekly_view_count++)<br/>2. Cập nhật Cache (recently_viewed)
    
    alt Counter >= Threshold (VD: 10)
        ATTR->>K_ET: Bắn Event Trả Thưởng (View_10_Items_Reward)
        ATTR->>ATTR: Reset Counter
        K_ET->>TP: Consume Reward Event
        TP->>TP: Cộng điểm (Transaction ACID)
    end

3.2. Luồng Xử lý Giao dịch Tài chính Trực tiếp (Ví dụ: Redeem Item / Transfer)

Mô tả: Các giao dịch mang tính tài chính trực tiếp (chuyển điểm, đổi quà) được gọi trực tiếp qua API tới Transaction Service để xử lý đồng bộ (Synchronous), giúp đảm bảo tốc độ phản hồi ngay lập tức cho người dùng và tính toàn vẹn dữ liệu.

sequenceDiagram
    participant MA as Member App
    participant TP as Transaction Service
    participant K_NT as Kafka (noti-topic)
    participant NS as Notification Service

    MA->>TP: Gọi API trực tiếp (Redeem_Item / Transfer)
    
    TP->>TP: BEGIN DB TRANSACTION
    TP->>TP: Validate Số dư & Điều kiện
    TP->>TP: Debit (-) Điểm & Cập nhật State/Inventory
    TP->>TP: COMMIT TRANSACTION
    
    TP-->>MA: Trả kết quả thành công (200 OK)
    
    TP->>K_NT: Bắn Event Giao dịch Thành công
    K_NT->>NS: Consume Event
    NS->>MA: Đẩy Noti (Firebase Push/SMS)

4. Lựa chọn Công nghệ & Hạ tầng (Technology Stack & Infrastructure)

  • Backend (Microservices): Sử dụng Java / Spring Boot. Lý do: Hệ sinh thái phong phú, độ ổn định cực cao (Enterprise-grade) chuyên trị các hệ thống tài chính/giao dịch khắt khe.
  • Message Broker: Apache Kafka. Lý do: Khả năng xử lý thông lượng khổng lồ (high-throughput), độ trễ cực thấp, hỗ trợ cơ chế lưu trữ bền vững (persistence) và phân chia luồng qua Consumer Groups.
  • Database Chính: PostgreSQL. Lý do: Khả năng hỗ trợ ACID mạnh mẽ cho Transaction Service, đồng thời hỗ trợ kiểu dữ liệu JSONB tối ưu cho mô hình EAV (Entity-Attribute-Value) của Attribute Service.
  • Caching: Redis. Lý do: Tốc độ Read/Write in-memory cực nhanh, phù hợp cho việc lưu trữ cache dữ liệu có tần suất đọc cao phi tài chính (ví dụ: recently viewed items).
  • Data Warehouse: Doris. Lý do: Phục vụ bóc tách dữ liệu báo cáo, phân tích (BI) và phân tập khách hàng (Segmentation) mà không làm suy giảm hiệu năng của hệ thống CSDL tác nghiệp (OLTP).

5. Giải pháp Đảm bảo Chất lượng (Non-Functional Highlights)

  • Hiệu năng & Mở rộng (Performance & Scalability):
    • Tách bạch luồng dữ liệu (Isolation): Việc tách riêng luồng giao dịch cốt lõi (Direct) và luồng theo dõi hành vi (Tracking) giúp Core Engine tập trung 100% công suất cho dòng tiền/điểm.
    • Event-Driven & Async processing: Các luồng không yêu cầu phản hồi ngay được đẩy qua Kafka, cho phép các service tự điều chỉnh tốc độ tiêu thụ (throttle) và dễ dàng mở rộng ngang (horizontal scaling) thông qua việc tăng partition của Kafka.
  • Bảo mật & Tính toàn vẹn (Security & Data Integrity):
    • Idempotency (Tính luỹ đẳng): Transaction Service đảm bảo mọi giao dịch cộng/trừ điểm hoặc cấp thẻ/voucher đều kiểm tra khóa Idempotent, chống duplicate event sinh ra từ mạng chập chờn.
    • ACID Transaction: Mọi biến động điểm số hay trạng thái kho (voucher) đều được thực thi và khóa chặt trong 1 Database Transaction nguyên tử.
  • Tính khả dụng & Giám sát (Availability & Monitoring):
    • Smart Routing & Fallback: Event Processor kiểm tra định dạng Schema của từng sự kiện đầu vào. Các sự kiện lỗi định dạng sẽ bị reject hoặc đẩy vào Dead Letter Queue (DLQ) để điều tra và phục hồi sau, đảm bảo không làm sập các service thụ hưởng phía sau.