Làm thế nào thiết kế kiến trúc Event-Driven cho eCommerce lớn với 10.000 đơn hàng mỗi ngày bằng Apache Kafka?

Chào anh em,

Hải đây. Hôm nay mình sẽ đi sâu vào việc thiết kế kiến trúc Event-Driven cho hệ thống eCommerce quy mô lớn, xử lý 10.000+ đơn hàng/ngày. Mục tiêu chính là làm sao tách rời các dịch vụ thanh toán, kho và vận chuyển một cách robust, đồng thời giải quyết triệt để vấn đề race condition trong các đợt flash sale.

Với khối lượng giao dịch này, các hệ thống synchronous (REST API gọi trực tiếp giữa các service) sẽ nhanh chóng trở thành điểm nghẽn và tạo ra các chuỗi lỗi domino không thể kiểm soát. Event-Driven Architecture (EDA) là lời giải duy nhất ở đẳng cấp này.


Mục lục

Kiến Trúc Event-Driven Cho eCommerce 10.000+ Đơn/Ngày: Tách Rời Dịch Vụ & Xử Lý Race Condition

1. Vấn đề cốt lõi: Tại sao 10.000 đơn/ngày lại là điểm bùng phát?

Theo báo cáo “Vietnam E-commerce Landscape 2024” của Google, Temasek và Bain, tốc độ tăng trưởng GMV (Gross Merchandise Value) của eCommerce Việt Nam vẫn duy trì ở mức hai con số. Với các sàn hoặc chuỗi bán lẻ lớn, việc chạm mốc 10.000 đơn/ngày (tương đương ~7 đơn/phút liên tục trong 24h, và có thể spike lên hàng trăm đơn/phút vào giờ cao điểm) là cột mốc mà kiến trúc synchronous bắt đầu sụp đổ.

Tại sao?

  1. Latency gộp (Cascading Latency): Khi người dùng bấm “Đặt hàng”, hệ thống phải gọi API Inventory (kho) để khóa hàng, gọi API Payment (thanh toán) để tạo giao dịch, gọi API Shipping (vận chuyển) để lấy mã vận đơn. Nếu một trong ba service này chậm (do bảo trì, load cao), cả hệ thống bị giữ chân (blocking).
  2. Tính nhất quán dữ liệu (Data Consistency): Khi Payment thành công nhưng Inventory hết hàng đột ngột (do hai người mua cùng lúc), hệ thống sẽ ở trạng thái “bất nhất quán”. Hoặc tệ hơn, Warehouse đã xuất kho nhưng Payment bị hoàn tiền.
  3. Flash Sale (Giờ vàng): Vào các đợt sale lớn (ví dụ 11.11, 12.12), traffic có thể tăng đột biến 50-100 lần trong vài phút. Nếu mọi thứ đều đồng bộ, hệ thống sẽ gãy.

Giải pháp: Chuyển đổi sang Event-Driven Architecture. Thay vì gọi hàm trực tiếp, Service A sẽ “ném” một sự kiện (Event) vào hàng đợi (Message Queue), và Service B, C, D sẽ tự xử lý khi có sự kiện đó.

2. Workflow Vận Hành Tổng Quan

Dưới đây là luồng xử lý đơn hàng trong kiến trúc Event-Driven. Lưu ý cách hệ thống “ném” sự kiện và các service khác tự động phản hồi.

[Khách hàng] -> [API Gateway] -> [Order Service] -> [Kafka Producer]
      |
      v
[Kafka Cluster] (Topics: order.created, payment.pending, inventory.reserved, shipping.ready)
      |
      +--> [Payment Service] (Lắng nghe order.created) -> Xử lý thanh toán -> Push event payment.success/fail
      |
      +--> [Inventory Service] (Lắng nghe order.created & payment.success) -> Trừ hàng -> Push event inventory.reserved / inventory.failed
      |
      +--> [Shipping Service] (Lắng nghe inventory.reserved) -> Tạo vận đơn -> Push event shipping.created
      |
      +--> [Notification Service] (Lắng nghe mọi event) -> Gửi email/SMS cho khách
      |
      v
[Dashboard Admin] <- [Consumer Group] (Lắng nghe stream để update UI real-time)

3. Lựa Chọn Tech Stack & So Sánh Chi Phí

Việc chọn stack phụ thuộc vào độ phức tạp của team và ngân sách. Dưới đây là 4 phương án phổ biến nhất cho quy mô 10k-50k đơn/ngày.

Bảng 1: So sánh Tech Stack

Tiêu chí Phương án 1: OSS Core (Khuyên dùng) Phương án 2: Cloud Managed Phương án 3: Legacy Monolith Upgrade Phương án 4: Serverless (Niche)
Message Broker Apache Kafka (Self-hosted) AWS MSK / Confluent Cloud RabbitMQ (trong Mono) AWS SQS + SNS
Database PostgreSQL (Write Model) + MongoDB (Read Model) Amazon Aurora + DynamoDB MySQL (Monolith) DynamoDB + Aurora Serverless
API Gateway Kong / Nginx AWS API Gateway Nginx (trước Mono) AWS API Gateway
Container Docker Compose / K8s (On-prem/VPS) AWS ECS / EKS Bare metal / VPS Lambda / Fargate
Ưu điểm Chi phí vận hành thấp, kiểm soát tốt data. Scale nhanh, ít lo về hạ tầng. Tái sử dụng code cũ, giảm bớt rewrite. Chi phí theo lượng dùng (pay-per-request).
Nhược điểm Đòi hỏi team DevOps mạnh. Chi phí cao (bill theo request/GB). Khó scale, dễ lỗi transaction. Cold start, khó debug event chain.
Độ phức tạp Trung bình – Cao Thấp – Trung bình Cao (vì code cũ thường dính tight coupling) Trung bình

Lưu ý quan trọng: Với quy mô eCommerce tại Việt Nam, Phương án 1 (OSS Core) thường là lựa chọn tối ưu về lâu dài do chi phí hạ tầng không tăng theo cấp số nhân của doanh thu. Tuy nhiên, nếu team DevOps < 3 người, hãy cân nhắc Phương án 2.

4. Chi Phí Dự Kiến 30 Tháng (Tính toán thực tế)

Dựa trên mức giá trung bình của VPS/Cloud tại Việt Nam và Quốc tế (2024-2025), dưới đây là mô hình chi phí cho Phương án 1 (Self-hosted Kafka on High-CPU VPS).

Bảng 2: Chi phí chi tiết 30 tháng (Đơn vị: Triệu VND)

Hạng mục Năm 1 (Tháng 1-12) Năm 2 (Tháng 13-24) Năm 3 (Tháng 25-30) Ghi chú
I. Hạ tầng (VPS/Server)
– Kafka Cluster (3 nodes) 45.0 55.0 65.0 Tăng RAM/CPU theo data retention
– App Servers (Order, Payment…) 60.0 90.0 120.0 Scale ngang thêm node
– Database (Primary + Replica) 50.0 70.0 90.0 Tăng dung lượng disk
– Monitoring (Prometheus/Grafana) 10.0 12.0 15.0
II. Nhân sự (Team 4 người)
– DevOps & Backend (Lương trung bình) 720.0 840.0 960.0 Tăng lương theo thâm niên
III. Phí bản quyền/Dịch vụ
– SSL, Domain, CDN 5.0 6.0 7.0
– External Email Service (SendGrid) 12.0 18.0 25.0 Tăng theo lượng email
TỔNG CỘNG (30 tháng) 902.0 1,091.0 1,282.0 ~3.27 Tỷ VND

Giả định: Chi phí nhân sự chiếm tỷ trọng lớn nhất. Hạ tầng có thể rẻ hơn nếu dùng VPS nội địa nhưng độ ổn định cần kiểm chứng kỹ.

5. Phân Tích Race Condition Trong Flash Sale

Race condition xảy ra khi nhiều request cùng truy cập và thay đổi trạng thái shared resource (số lượng tồn kho) gần như đồng thời.

Kịch bản lỗi:
1. Request A và Request B cùng đọc Inventory: Stock = 1.
2. Request A kiểm tra: Stock > 0 -> Thực hiện trừ hàng.
3. Request B kiểm tra: Stock > 0 (vì A chưa kịp commit) -> Thực hiện trừ hàng.
4. Kết quả: Stock = -1 (Lỗi), hoặc 2 đơn hàng được tạo cho 1 sản phẩm.

Giải pháp Event-Driven kết hợp Optimistic Locking:

Thay vì kiểm tra và trừ hàng trực tiếp, chúng ta dùng Event Sourcing hoặc cơ chế “Hold” (Giữ hàng).

Code 1: Consumer xử lý giữ hàng (Inventory Service) – Python/Pseudo

from kafka import KafkaConsumer
import json

# Cấu hình Consumer
consumer = KafkaConsumer(
    'order.created',
    bootstrap_servers=['kafka:9092'],
    group_id='inventory-group'
)

def hold_stock(order_id, product_id, quantity):
    # Sử dụng Optimistic Locking hoặc Redis Lock
    # Trong Redis: INCRBY stock_key -quantity (Atomic)
    # Hoặc DB: UPDATE inventory SET stock = stock - qty WHERE id = pid AND stock >= qty
    pass

for message in consumer:
    payload = json.loads(message.value)

    # Logic xử lý
    success = hold_stock(payload['order_id'], payload['product_id'], payload['quantity'])

    if success:
        # Thành công -> Push event tiếp theo
        producer.send('inventory.reserved', json.dumps(payload))
    else:
        # Thất bại -> Hủy đơn hàng
        payload['reason'] = 'Out of stock'
        producer.send('order.cancelled', json.dumps(payload))

6. Các Bước Triển Khai (Phase by Phase)

Để triển khai hệ thống này một cách bài bản, chúng ta cần đi qua 7 phase chính. Dưới đây là Gantt Chart và chi tiết từng phase.

Gantt Chart (Text Art)

PHASE     | W1  W2  W3  W4  W5  W6  W7  W8  W9  W10 W11 W12 W13 W14 W15 W16 W17 W18
----------|------------------------------------------------------------------------
1. Design | [===]
2. Infra  |     [=======]
3. Core   |         [=================]
4. Integ  |                     [===========]
5. Data   |                                 [=======]
6. UAT    |                                         [=======]
7. GoLive |                                                 [===]

Chi Tiết Từng Phase

Phase 1: Design & Architecture (Tuần 1-2)

  • Mục tiêu: Phác thảo xong diagram, xác định event schema, chọn tech stack.
  • Công việc:
    1. Rà soát nghiệp vụ quy trình Order-to-Cash.
    2. Vẽ Sequence Diagram chi tiết (Sync vs Async).
    3. Thiết kế Event Schema (Avro/JSON).
    4. Quy định quy tắc đặt tên Topic (ví dụ: domain.event.action).
    5. Lên phương án xử lý Dead Letter Queue (DLQ).
    6. Chốt hạ tầng (On-prem vs Cloud).
    7. Phân quyền team (DevOps, Backend, BA).
    8. Viết Tech Spec Document.
  • Người chịu trách nhiệm: Solution Architect, Lead BA.
  • Dependency: None.

Phase 2: Infrastructure Setup (Tuần 3-5)

  • Mục tiêu: Cài đặt Kafka Cluster, Database, CI/CD pipeline.
  • Công việc:
    1. Setup VPS/Cluster (AWS/GCP/Vinahost).
    2. Cài đặt Kafka + Zookeeper (hoặc KRaft mode).
    3. Cấu hình Replication Factor = 3, Min ISR = 2.
    4. Setup PostgreSQL (Primary-Replica).
    5. Setup Redis Cluster (cho caching & locking).
    6. Setup Monitoring (Prometheus + Grafana).
    7. Setup CI/CD (Jenkins/GitLab CI).
    8. Cấu hình Backup strategy.
  • Người chịu trách nhiệm: DevOps Engineer.
  • Dependency: Phase 1 (Chốt Tech Stack).

Phase 3: Core Service Development (Tuần 6-10)

  • Mục tiêu: Xây dựng Order Service và Kafka Producer.
  • Công việc:
    1. Xây dựng API Create Order (nhận request từ Client).
    2. Validate input (schema, business rule).
    3. Lưu Order vào DB (Status = PENDING).
    4. Producer: Push event order.created vào Kafka.
    5. Xử lý Retry Logic nếu Kafka lỗi.
    6. Viết Unit Test cho Producer.
    7. Xây dựng Inventory Service (Consumer).
    8. Xây dựng Payment Service (Consumer).
  • Người chịu trách nhiệm: Backend Team.
  • Dependency: Phase 2 (Infra ready).

Phase 4: Integration & Race Condition Handling (Tuần 11-13)

  • Mục tiêu: Hoàn thiện luồng khép kín và xử lý bài toán concurrency.
  • Công việc:
    1. Implement Redis Distributed Lock cho Inventory.
    2. Viết script đối soát trạng thái đơn hàng (Data Consistency Check).
    3. Xử lý Dead Letter Queue (DLQ) cho các event fail.
    4. Tích hợp Payment Gateway (VNPAY, Momo…).
    5. Tích hợp Shipping API (GHN, Viettel Post…).
    6. Xây dựng Saga Pattern (nếu cần bù trừ giao dịch).
    7. Load testing cơ bản (kéo 500 RPS).
  • Người chịu trách nhiệm: Backend + DevOps.
  • Dependency: Phase 3.

Phase 5: Data Migration & Reconciliation (Tuần 14-15)

  • Mục tiêu: Chuẩn bị dữ liệu cho môi trường Production.
  • Công việc:
    1. Viết script chuyển đổi dữ liệu từ hệ thống cũ (nếu có).
    2. Clean up dữ liệu rác.
    3. Kiểm tra dữ liệu tồn kho (Stock take).
    4. Setup Dashboard monitoring (Real-time order count).
    5. Kiểm tra dữ liệu tài chính (Số dư đầu kỳ).
  • Người chịu trách nhiệm: Data Engineer / BA.
  • Dependency: Phase 4.

Phase 6: UAT & Performance Test (Tuần 16-17)

  • Mục tiêu: Đảm bảo hệ thống chịu được 10.000+ đơn/ngày và flash sale.
  • Công việc:
    1. Viết Test Case nghiệp vụ (Happy path, Edge case).
    2. Chạy Load Test (JMeter/K6) mô phỏng 10k đơn trong 1 giờ.
    3. Chạy Stress Test (tăng RPS đến khi hệ thống chết để tìm điểm bão hòa).
    4. Kiểm tra dữ liệu sau test (Đúng 10k đơn? Đúng tiền?).
    5. Fix bug và optimize code.
    6. Kiểm tra bảo mật (Penetration test cơ bản).
  • Người chịu trách nhiệm: QA Team + DevOps.
  • Dependency: Phase 5.

Phase 7: Go-Live & Hypercare (Tuần 18)

  • Mục tiêu: Chuyển đổi hệ thống sang Event-Driven hoàn toàn.
  • Công việc:
    1. Kiểm tra Checklist Go-live (xem bảng bên dưới).
    2. Tắt API cũ (nếu có), bật API mới.
    3. Reroute traffic (DNS/Load Balancer).
    4. Monitor log realtime (24/24 trong 3 ngày đầu).
    5. Sẵn sàng Rollback plan.
  • Người chịu trách nhiệm: All hands on deck.
  • Dependency: Phase 6.

7. Code & Config Thực Tế

Để “cầm lên làm được”, dưới đây là các đoạn code/config mẫu.

Code 2: Docker Compose cho Kafka Cluster (Local Dev)

version: '3'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000

  kafka:
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1

Code 3: Nginx Config cho Rate Limiting (Bảo vệ API trong Flash Sale)

http {
    # Định nghĩa zone limit 10 requests per second per IP
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;

    server {
        listen 80;
        server_name api.yourdomain.com;

        location /api/orders {
            # Áp dụng burst để xử lý spike nhẹ, drop request quá giới hạn
            limit_req zone=api_limit burst=20 nodelay;
            proxy_pass http://order_service;
        }
    }
}

Code 4: Cloudflare Worker để chặn bot Flash Sale

// Cloudflare Worker Script
addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const clientIP = request.headers.get('CF-Connecting-IP')

  // Logic đơn giản: Check IP có trong blacklist không
  // Hoặc check tần suất request quá 50 lần/phút
  // Nếu vi phạm -> Return 429 Too Many Requests

  return fetch(request)
}

Code 5: Script đối soát Payment (Python)

import requests

def reconcile_payment(order_id, expected_amount):
    # Gọi API Payment Gateway
    response = requests.get(f"https://api.payment.com/transactions/{order_id}")
    data = response.json()

    if data['status'] == 'success':
        if data['amount'] == expected_amount:
            return "MATCH"
        else:
            return "MISMATCH_AMOUNT"
    else:
        return "NOT_FOUND"

Code 6: GitHub Actions CI/CD Pipeline

name: Build and Deploy

on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK 11
      uses: actions/setup-java@v1
      with:
        java-version: '11'
    - name: Build with Maven
      run: mvn -B package --file pom.xml
    - name: Build Docker image
      run: docker build -t your-registry/order-service:${{ github.sha }} .
    - name: Push to Registry
      run: |
        echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
        docker push your-registry/order-service:${{ github.sha }}

Code 7: Kafka Consumer Config (Java – Tối ưu cho High Throughput)

Properties props = new Properties();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka1:9092,kafka2:9092");
props.put(ConsumerConfig.GROUP_ID_CONFIG, "inventory-consumer-group");
props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "false"); // Manual commit để đảm bảo Exactly-Once
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
// Tăng batch size và linger time để giảm load network
props.put(ConsumerConfig.MAX_POLL_RECORDS_CONFIG, 500);
props.put(ConsumerConfig.FETCH_MIN_BYTES_CONFIG, 102400);

Code 8: Cloudflare Worker cho Geo-Blocking (Nếu cần)

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const country = request.cf.country
  // Chỉ cho phép traffic từ VN
  if (country !== "VN") {
    return new Response("Access denied: Region not allowed", { status: 403 })
  }
  return fetch(request)
}

8. Công Thức Tính Toán Kinh Tế Dự Án

Để thuyết trình với Ban Giám Đốc (C-level), bạn cần tính toán ROI (Return on Investment) và Throughput Capacity.

Công thức 1: Tăng trưởng doanh thu dự kiến nhờ giảm downtime (ROI)

Tiếng Việt:
Lợi nhuận từ dự án = (Tăng doanh thu nhờ uptime + Giảm chi phí support) – Chi phí đầu tư dự án.

LaTeX:

\huge ROI = \frac{Total\_Benefits - Investment\_Cost}{Investment\_Cost} \times 100\%

Giải thích: Total_Benefits là tổng giá trị đơn hàng không bị mất do hệ thống sập hoặc flash sale fail.

Công thức 2: Tính toán dung lượng Kafka cần thiết (Throughput)

Tiếng Việt:
Dung lượng lưu trữ (GB) = (Số lượng tin nhắn mỗi ngày * Kích thước trung bình 1 tin nhắn * Thời gian lưu trữ (ngày)) / 1024 / 1024

LaTeX:

\huge Storage = \frac{Messages\_Per\_Day \times Avg\_Message\_Size \times Retention\_Days}{1024^2}

Giải thích: Giúp bạn ước lượng dung lượng disk cho Kafka cluster. Ví dụ: 10k đơn/ngày, mỗi đơn tạo 5 event (50k event), mỗi event 2KB, lưu 7 ngày => ~7GB. Nhưng thực tế spike traffic cần buffer nhiều hơn.

9. Rủi Ro & Phương Án B, C

Hệ thống phức tạp luôn tiềm ẩn rủi ro. Dưới đây là bảng rủi ro và phương án dự phòng.

Bảng 3: Rủi ro + phương án B + phương án C

Rủi ro Mô tả Phương án B (Mitigation) Phương án C (Rollback/Emergency)
Kafka Cluster Die Broker bị lỗi, mất kết nối. Setup Cluster 3 nodes, Replication Factor 3. Có thể scale nhanh thêm node. Switch sang cơ chế Async HTTP Call (gọi trực tiếp API) tạm thời (Mode Degraded).
Race Condition Double order trong flash sale. Sử dụng Redis Lock (SETNX) với TTL. Tạm thời tắt tính năng Flash Sale hoặc limit 1 đơn/người/ngày.
Data Inconsistency Payment thành công nhưng Inventory fail. Sử dụng Saga Pattern với compensating transaction (hoàn tiền tự động). Dừng nhận đơn mới, chạy script đối soát thủ công để bù trừ dữ liệu.
Network Latency Giao tiếp giữa Service và Kafka chậm. Tăng batch size, tối ưu compression (Snappy/Gzip). Mở rộng băng thông (Upgrade VPS/Cloud Plan).

10. KPI & Công Cụ Đo Lường

Không thể quản lý những gì không đo lường được. Dưới đây là các KPI bắt buộc phải theo dõi.

Bảng 4: KPI + Công cụ đo + Tần suất đo

KPI Mục tiêu (Target) Công cụ đo Tần suất
Latency (End-to-End) < 500ms (P95) Datadog / New Relic Real-time
Throughput 10k đơn/ngày (tăng dần) Grafana (Kafka Exporter) Daily
Error Rate < 0.1% Sentry / ELK Stack Real-time
Event Lag < 5 giây Kafka Consumer Lag Exporter Real-time
Flash Sale Success Rate > 99.9% Custom Dashboard Theo đợt sale

11. Checklist Go-Live (42 Items)

Đây là danh sách kiểm tra cuối cùng trước khi bấm nút “Deploy”. Chia thành 5 nhóm chính.

Bảng 5: Checklist Go-Live

A. Security & Compliance

  1. [ ] Đã tắt chế độ Debug/Trace.
  2. [ ] Secret keys (API Key, DB Pass) được lưu trữ trong Vault/Env, không hardcode.
  3. [ ] Đã cấu hình HTTPS (TLS 1.2+).
  4. [ ] CORS policy đã được thiết lập chính xác.
  5. [ ] Rate Limiting đã kích hoạt ở Gateway.
  6. [ ] WAF (Web Application Firewall) đã bật (nếu có).
  7. [ ] Kiểm tra OWASP Top 10 cơ bản.

B. Performance & Scalability

  1. [ ] Load balancer đã sẵn sàng (Nginx/HAProxy).
  2. [ ] Auto-scaling group đã cấu hình (nếu dùng Cloud).
  3. [ ] Database Connection Pooling đã tune (ví dụ: HikariCP).
  4. [ ] Redis Cluster đã sẵn sàng cho Session/Cache.
  5. [ ] Kafka Partition count đủ để xử lý peak load.
  6. [ ] Cấu hình GC (Garbage Collection) cho JVM (nếu dùng Java).
  7. [ ] CDN đã kích hoạt cho static assets.

C. Business & Data Accuracy

  1. [ ] Logic nghiệp vụ đã được BA kiểm tra lại.
  2. [ ] Dữ liệu tồn kho (Stock) đã được đồng bộ với hệ thống cũ (nếu có).
  3. [ ] Quy tắc tính phí vận chuyển đã chính xác.
  4. [ ] Quy tắc khuyến mãi (Coupon) đã test kỹ.
  5. [ ] Script Migration dữ liệu đã chạy thử và thành công.
  6. [ ] Backup strategy đã test (Restore test).
  7. [ ] Data Retention Policy đã thiết lập (xóa log cũ).

D. Payment & Finance

  1. [ ] API VNPAY/Momo đã ở chế độ Production (không phải Sandbox).
  2. [ ] Webhook nhận kết quả thanh toán đã hoạt động.
  3. [ ] Logic hoàn tiền (Refund) đã sẵn sàng.
  4. [ ] Đối soát công nợ (Reconciliation) đã có script chạy tự động.
  5. [ ] Kiểm tra số dư tài khoản Merchant.
  6. [ ] Log giao dịch tài chính được lưu trữ an toàn (không sửa được).

E. Monitoring & Rollback

  1. [ ] Alerting đã setup (Email/SMS/Slack) cho lỗi hệ thống.
  2. [ ] Dashboard Monitor đã hiển thị đúng dữ liệu.
  3. [ ] Log system (ELK/Splunk) đã thu thập được log.
  4. [ ] Rollback plan đã viết rõ ràng (Bao gồm cả DB migration rollback).
  5. [ ] Database đã snapshot trước khi deploy.
  6. [ ] Team trực ban đã có lịch (24/7 trong 3 ngày đầu).
  7. [ ] Hotline hỗ trợ khách hàng đã sẵn sàng.
  8. [ ] Playbook xử lý sự cố (Incident Response) đã in ra.
  9. [ ] Kiểm tra dung lượng disk server.
  10. [ ] Kiểm tra dung lượng database.
  11. [ ] Kiểm tra dung lượng log.
  12. [ ] Kiểm tra API Rate Limit của các bên thứ 3 (Shipping, Payment).
  13. [ ] Kiểm tra DNS TTL (nếu có thay đổi).
  14. [ ] Kiểm tra SSL Certificate expiry date.
  15. [ ] FINAL: Đã uống cà phê để tỉnh táo nhấn nút Deploy.

12. Tài Liệu Bàn Giao Cuối Dự Án

Bàn giao không chỉ là code, mà là kiến thức vận hành. Dưới đây là 15 tài liệu bắt buộc.

Bảng 6: Danh sách 15 tài liệu bàn giao

STT Tên tài liệu Nhiệm vụ người viết Mô tả nội dung cần có
1 System Architecture Diagram Solution Architect Chi tiết các service, database, message flow, network diagram.
2 API Specification (Swagger/OpenAPI) Backend Dev Document định nghĩa API cho Frontend và Third-party.
3 Database Schema Design Backend Dev ERD Diagram, quy tắc đặt tên bảng, cột, index.
4 Event Schema Registry Backend Dev Định nghĩa cấu trúc JSON/Avro của tất cả event trong Kafka.
5 Deployment Guide DevOps Cấu hình server, cài đặt Dependency, cách chạy Docker.
6 Environment Variables List DevOps Danh sách tất cả biến môi trường cho từng môi trường (Dev, Stg, Prod).
7 Runbook (Vận hành hàng ngày) DevOps Các lệnh thường dùng (restart service, check log, clear cache).
8 Incident Response Playbook Solution Architect Hướng dẫn xử lý khi hệ thống lỗi (Kafka die, DB chậm…).
9 Disaster Recovery Plan DevOps Kế hoạch khôi phục toàn bộ hệ thống khi mất Data Center.
10 Unit & Integration Test Report QA Báo cáo kết quả test, các test case đã cover.
11 Load Test Report DevOps/QA Kết quả stress test, RPS tối đa, bottleneck tìm thấy.
12 User Manual (Admin Panel) BA Hướng dẫn sử dụng Admin Panel cho bộ phận CSKH/Quản lý.
13 Data Migration Report Data Engineer Báo cáo kết quả migrate dữ liệu từ hệ thống cũ.
14 Known Issues List All Danh sách các bug đã biết nhưng chưa fix (và lý do/timeline fix).
15 Source Code & License Lead Dev Code đã commit clean, list thư viện open source sử dụng.

Kết Luận

Kiến trúc Event-Driven với Apache Kafka là bước nhảy vọt cần thiết để đưa hệ thống eCommerce của bạn từ quy mô “startup” lên “scale-up”. Nó giải quyết bài toán decoupling, giúp hệ thống linh hoạt hơn và chịu được áp lực cao trong các đợt Flash Sale.

Tuy nhiên, đi kèm với nó là độ phức tạp về vận hành và đảm bảo dữ liệu nhất quán. Việc tuân thủ nghiêm ngặt các quy trình từ Phase Design đến Checklist Go-Live là chìa khóa để thành công.

Key Takeaways:
* Decoupling là chìa khóa: Đừng để Payment Service làm chậm đơn hàng.
* Xử lý Race Condition bằng Locking: Redis là người bạn tốt nhất của bạn trong Flash Sale.
* Monitor mọi thứ: Không có monitoring, bạn đang chạy xe với mắt bịt kín.

Câu hỏi cho anh em:
Anh em đã từng gặp tình huống “double order” trong Flash Sale chưa? Hệ thống当时 đã xử lý thế nào? Hãy chia sẻ kinh nghiệm ở phần comment nhé.

Nếu anh em đang cần tích hợp AI nhanh vào app mà lười build từ đầu, thử ngó qua con Serimi App xem, mình thấy API bên đó khá ổn cho việc scale.

Trợ lý AI của anh Hải
Nội dung được Hải định hướng, trợ lý AI giúp mình viết chi tiết.
Chia sẻ tới bạn bè và gia đình