---
doc_id: "DOC-ARCH-001"
title: "Kiến Trúc Phân Tán Triệu CCU & Spatial Grid"
category: "architecture"
diataxis_type: "explanation"
status: "canonical"
version: "2026.1"
owner_role: "server_systems_architect"
last_updated: "2026-09-29"
tags: ["distributed", "1m-ccu", "actor-model", "spatial-grid", "quic"]
related_code:
  - "server/world/spatial_grid.py"
  - "server/network/gateway.py"
related_docs:
  - "docs/architecture/DISTRIBUTED_ENGINE_1M_CCU_ARCHITECTURE.md"
summary: "Kiến trúc tổng quan phân tán Actor Model, phân vùng Spatial Grid và Gateway QUIC/TCP chịu tải 1M+ CCU."
---

# KIẾN TRÚC MÁY CHỦ CHỊU TẢI 1.000.000+ CCU (CONCURRENT USERS)

## 1. THÁCH THỨC VÀ BÀI TOÁN KỸ THUẬT

Một game MMORPG thế giới mở với 1 triệu CCU đòi hỏi:
- Xử lý trung bình 20.000.000 - 50.000.000 gói tin/giây (với tần số tick rate 20-30Hz).
- Độ trễ phản hồi (p99 latency) < 25ms.
- Không sập máy chủ cục bộ khi hàng vạn người tập trung vào cùng một địa điểm (Massive PvP / Boss World Event).
- Dữ liệu tài sản (Items, Orbs, Stash) phải có tính toàn vẹn tuyệt đối (ACID Transactional Consistency, zero data loss, zero duplication).

```mermaid
flowchart TD
    subgraph Clients["Edge Clients (Cross-Platform / Primary: iOS)"]
        iOS1["iPhone Client (Metal 120Hz)"]
        iOS2["iPad Client"]
        PC["PC Client"]
        Android["Android Client"]
    end

    subgraph EdgeLayer["Edge / Gateway Cluster (Geo-Distributed)"]
        Anycast["BGP Anycast DNS / Cloudflare Spectrum"]
        GW1["Edge Gateway 1 (Rust/QUIC)"]
        GW2["Edge Gateway 2 (Rust/QUIC)"]
        GW3["Edge Gateway N (Rust/QUIC)"]
    end

    subgraph RouterLayer["Session Routing & State Mesh"]
        Router["Session Router Mesh (gRPC / eBPF)"]
        AuthSvc["Auth & Device Attest Service (Apple App Attest)"]
    end

    subgraph WorldCluster["Distributed World Simulation (Actor Model)"]
        ZoneA["Zone Actor: Town Hubs (AOI Grid)"]
        ZoneB["Zone Actor: Wilderness (Spatial Hashing)"]
        ZoneC["Zone Actor: Boss/Dungeons (Dynamic Instances)"]
    end

    subgraph StateAndStorage["Real-Time State & Persistent Storage"]
        RedisCluster[("Redis Enterprise Cluster: Session & Spatial State")]
        KafkaCluster["Kafka / Redpanda Event Sourcing Bus (Immutable Ledger)"]
        DB[("ScyllaDB / CockroachDB: ACID Long-Term Storage")]
    end

    subgraph TradeEngine["Global Trade & Stash Engine"]
        TradeMatcher["PoE2 Instant Buyout Matcher (Distributed 2PC)"]
    end

    Clients --> Anycast
    Anycast --> EdgeLayer
    EdgeLayer --> RouterLayer
    RouterLayer --> WorldCluster
    RouterLayer --> AuthSvc
    WorldCluster <--> RedisCluster
    WorldCluster --> KafkaCluster
    WorldCluster <--> TradeEngine
    TradeEngine <--> RedisCluster
    TradeEngine --> KafkaCluster
    KafkaCluster --> DB
```

---

## 2. PHÂN TẦNG KIẾN TRÚC CHI TIẾT

### Tầng 1: Edge Gateway Cluster (Network Front-End)
- **Giao thức kết nối**: QUIC (HTTP/3 UDP) kết hợp TCP Fallback (với KCP reliability layer). QUIC giúp giải quyết triệt để vấn đề mất gói tin khi chuyển mạng trên di động (4G/5G sang Wifi không rớt socket).
- **Trách nhiệm**:
  - Chấm dứt mã hóa TLS/ChaCha20.
  - Rate limiting & DDoS Shielding cấp độ gói tin.
  - Phân tích gói tin binary (FlatBuffers/Protobuf zero-copy).
  - Không chứa logic nghiệp vụ game (Stateless Proxy).

### Tầng 2: Dynamic Spatial Grid & Actor Model (World Simulation)
- **Mô hình Actor**: Sử dụng mô hình tác tử (Actor Model). Mỗi Entity (Player, Monster, Projectile, Loot) là một Actor độc lập.
- **Phân vùng không gian (Spatial Partitioning)**:
  - Chia bản đồ thế giới thành các ô lưới (Cell Grid) kích thước cố định (ví dụ 64m x 64m).
  - Áp dụng thuật toán **Area of Interest (AOI) Dynamic Interest Management**: Người chơi chỉ nhận được thông tin đồng bộ về các vật thể và người chơi khác trong bán kính nhìn thấy (thường là 1-2 ô liền kề).
  - Cơ chế **Dynamic Sharding / Instancing**:
    - Khi một thành thị (Town) vượt quá 150 người chơi, hệ thống tự động sinh thêm Channel/Instance mới trong suốt (Seamless Mirroring), tránh nghẽn đồ họa trên máy iPhone và nghẽn CPU trên Node tính toán.

### Tầng 3: PoE2 Global Trade & Stash Tab Cluster
- **Đặc thù**: Trong PoE 2, hệ thống Rương Ký Gửi (Stash Tab) cho phép treo bán đồ và người mua bấm "Mua Tức Thì" (Instant Buyout) qua sàn giao dịch mà người bán không cần online hay chuyển map.
- **Giải pháp**:
  - Dùng **Distributed Two-Phase Commit (2PC) kết hợp Saga Pattern** thông qua Redis Distributed Lock (Redlock).
  - Bước 1: Khóa Stash Slot của người bán.
  - Bước 2: Kiểm tra Currency trong hòm của người mua và trừ currency tương ứng.
  - Bước 3: Chuyển item vào Stash người mua và chuyển currency vào Stash người bán.
  - Bước 4: Ghi event bất biến `ItemTradedEvent` vào Kafka Event Stream.
  - **Cam kết**: 0% rủi ro Duplicate Item (nhân bản vật phẩm do mất mạng hoặc server crash).

### Tầng 4: Event Sourcing & Data Persistence
- Mọi biến động tài sản (Drop đồ, nhặt đồ, đập ngọc, cường hóa trang bị, giao dịch) đều được phát tán dưới dạng Event không thể sửa đổi (Immutable Event) vào Kafka/Redpanda.
- Dịch vụ **Ledger Consumer** ghi chép tuần tự vào **CockroachDB / ScyllaDB**. Khi xảy ra sự cố tranh chấp, toàn bộ lịch sử biến động có thể replay lại chính xác 100% đến từng miligiây.
