---
doc_id: "DOC-ARCH-004"
title: "Kiến Trúc Cơ Sở Dữ Liệu & Lưu Trữ Bất Biến 2PC"
category: "architecture"
diataxis_type: "explanation"
status: "canonical"
version: "2026.1"
owner_role: "server_systems_architect"
last_updated: "2026-09-29"
tags: ["database", "persistence", "cockroachdb", "redis", "2pc", "event-sourcing"]
related_code:
  - "server/auth/database.py"
  - "server/trade/consignment_vault.py"
related_docs:
  - "docs/adr/0002_two_phase_commit_distributed_ledger.md"
summary: "Thiết kế sổ cái tài chính phân tán 2PC, kiến trúc CockroachDB/PostgreSQL kết hợp Redis Cache chống dupe."
---

# KIẾN TRÚC CƠ SỞ DỮ LIỆU & LƯU TRỮ PHÍA MÁY CHỦ (SERVER DATABASE & PERSISTENCE ARCHITECTURE)

> **Dự án**: `FreeExile` — Dark Martial Savage Exile ARPG (PoE2 Spirit)  
> **Cấp độ kỹ thuật**: Chuẩn Công Nghiệp 2026 (Distributed Polyglot Persistence for 1.000.000+ CCU)  
> **Mục tiêu**: Đảm bảo **Zero-Data-Loss**, **Zero-Dupe**, **Strict Serializable ACID** cho tài sản và độ trễ truy xuất sub-millisecond.

---

## 1. THÁCH THỨC VÀ BÀI TOÁN KỸ THUẬT LƯU TRỮ 1.000.000 CCU

Trong một game ARPG nhịp độ cao 30Hz với quy mô **$1.000.000\text{ CCU}$**, hệ thống cơ sở dữ liệu phải đối mặt với các áp lực cực hạn:
- **Tần suất biến động dữ liệu khổng lồ**: Mỗi giây có hàng trăm ngàn lượt nhặt phôi trang bị, tiêu thụ đá huyết (crafting), rớt máu, tích lũy điểm kinh nghiệm và di chuyển tọa độ.
- **Tại sao RDBMS truyền thống (MySQL / PostgreSQL đơn khối) sụp đổ?**:
  1. *Nghẽn cổ chai Disk I/O*: Ghi đĩa trực tiếp cho hàng triệu thao tác mỗi giây gây nghẽn hàng đợi ghi (disk write saturation).
  2. *Tranh chấp khóa (Row Lock Contention)*: Giao dịch nhiều bảng (nhân vật, hòm đồ, chợ) gây deadlock và tăng vọt p99 latency từ $10\text{ms}$ lên $> 2.000\text{ms}$.
  3. *Thời gian phục hồi sự cố (Failover Downtime)*: Cơ chế Primary-Replica truyền thống mất từ $10\text{s} - 60\text{s}$ để bầu chọn Master mới, gây rớt hàng vạn kết nối.
- **Giải pháp của FreeExile**: Triển khai mô hình **Lưu Trữ Đa Phân Tầng Đa Nhiệm (4-Tier Polyglot Persistence Architecture)** kết hợp **Event Sourcing** và **Write-Behind Caching**.

---

## 2. TỔNG QUAN KIẾN TRÚC LƯU TRỮ 4 PHÂN TẦNG (POLYGLOT TOPOLOGY)

```mermaid
flowchart TD
    subgraph ClientAndGateway["Clients & Authoritative Gateways"]
        Clients["iOS / Mobile WebApp / PC Clients"]
        GW["Authoritative Gateway Cluster (QUIC / ChaCha20)"]
        Clients <--> GW
    end

    subgraph SimulationNodes["Game Zone Server Nodes (Actor Model & 30Hz Tick)"]
        Worker1["Zone Worker 1: In-Memory Game State"]
        Worker2["Zone Worker 2: In-Memory Game State"]
        WorkerN["Zone Worker N: In-Memory Game State"]
        GW <--> Worker1 & Worker2 & WorkerN
    end

    subgraph Tier1["Tầng 1: Hot In-Memory & Distributed Lock (Redis Enterprise)"]
        RedisSession[("Redis: Session Registry & Heartbeats")]
        RedisSpatial[("Redis: Dynamic Spatial & Shard Index")]
        RedisRank[("Redis: Realtime Leaderboard (ZSET)")]
    end

    subgraph Tier2["Tầng 2: Write-Ahead Immutable Ledger (Kafka / Redpanda)"]
        KafkaEvents["Kafka Event Sourcing Bus\n- ItemMintedEvent\n- FleshBoneAlteredEvent\n- CurrencySalvagedEvent"]
    end

    subgraph Tier3["Tầng 3: Distributed NewSQL ACID Store (CockroachDB)"]
        CDB_Accounts[("Accounts & Identities")]
        CDB_Chars[("Characters & Progression")]
        CDB_Inventory[("Inventories & Stash Tabs")]
        CDB_Seasons[("Seasonal Leagues & Migrations")]
    end

    subgraph Tier4["Tầng 4: Distributed Time-Series / Audit (ScyllaDB)"]
        ScyllaAudit[("Audit Logs & Trade History")]
        ScyllaTele[("Combat & Anti-Cheat Telemetry")]
    end

    subgraph TierEdge["Tầng Biên: Edge SQLite Databases (WAL Mode)"]
        SQLiteFeedback[("Isolated Feedback Store\ndata/feedback_store.db")]
        SQLiteTrade[("2PC Trade Ledger\ndata/trade_ledger.db")]
        SQLiteAgents[("Agent Delegations\ndata/agent_delegations.db")]
    end

    Worker1 & Worker2 & WorkerN <--> Tier1
    Worker1 & Worker2 & WorkerN -- "Sync High-Value Events" --> KafkaEvents
    Worker1 & Worker2 & WorkerN -. "Async Snapshot Checkpoint" .-> Tier3
    KafkaEvents --> Tier3
    KafkaEvents --> Tier4
    GW -. "Decoupled Async API" .-> SQLiteFeedback
```

---

## 3. PHÂN ĐỊNH CHI TIẾT TỪNG PHÂN TẦNG DỮ LIỆU

| Phân Tầng | Công Nghệ Chỉ Định | Mục Tiêu & Loại Dữ Liệu | Đảm Bảo Nhất Quán & Hiệu Năng |
| :--- | :--- | :--- | :--- |
| **Tầng 1: Hot In-Memory & Distributed Lock** | **Redis Enterprise Cluster** (Multi-AZ, In-Memory) | Session token, Heartbeat, Dynamic Spatial Grid registry, Leaderboard thời gian thực (`ZSET`). | Độ trễ $< 1\text{ms}$. RAM-only, AOF định kỳ 1s để dự phòng phục hồi. |
| **Tầng 2: Event Sourcing & WAL** | **Apache Kafka / Redpanda** (Raft-based, C++ core) | Write-Ahead Ledger cho toàn bộ biến động tài sản: rơi đồ, khảm nạm ngọc, phân giải phôi rác, reset mùa giải. | Bất biến (Immutable), throughput $> 2.000.000\text{ events/s}$, Zero data loss khi node sập. |
| **Tầng 3: Distributed NewSQL** | **CockroachDB** (Multi-Raft Consensus, PostgreSQL wire) | Kho dữ liệu quan hệ tài chính & thực thể: Tài khoản, Nhân vật, Huyết Cốt Ma Đồ, Rương Mùa Giải. | **Strict Serializable ACID**. Tự động Range-Sharding theo `account_id`. |
| **Tầng 4: Time-Series NoSQL** | **ScyllaDB / Apache Cassandra** (Wide-Column NoSQL) | Nhật ký kiểm toán kinh tế (Audit Logs), telemetry di chuyển và touch biometrics chống bot/hack, lịch sử biến động giá vật phẩm. | Tốc độ ghi cực hạn ($> 500.000\text{ IOPS}$), partition theo `(date, event_type)`. |
| **Tầng Biên: Edge Isolated** | **SQLite Embedded** (WAL Mode) | 2PC Trade Ledger (InstantBuyoutEngine), AI Agent Sessions (AgentOrbService), Kênh Góp ý, Báo lỗi. | Cô lập hoàn toàn, không phụ thuộc cụm cluster, WAL mode cung cấp Strict Isolation cho 2PC mà không cần Redis Redlock. |

---

## 4. BẢNG THIẾT KẾ SCHEMA CHUẨN (COCKROACHDB DDL SCHEMAS)

### 4.1. Phân Hệ Tài Khoản & Định Danh (Auth & Accounts)
```sql
-- Bảng tài khoản gốc (Universal Account)
CREATE TABLE accounts (
    account_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    username VARCHAR(32) NOT NULL UNIQUE,
    email VARCHAR(255) NOT NULL UNIQUE,
    password_hash VARCHAR(255) NOT NULL,
    status VARCHAR(20) NOT NULL DEFAULT 'ACTIVE', -- PENDING, ACTIVE, SUSPENDED, BANNED
    roles STRING[] NOT NULL DEFAULT ARRAY['player'],
    two_factor_secret VARCHAR(64),
    created_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp(),
    updated_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp()
);

-- Bảng liên kết OAuth nhà cung cấp bên ngoài (Apple Sign-In, Google, Steam)
CREATE TABLE account_oauth_identities (
    provider VARCHAR(32) NOT NULL,
    provider_user_id VARCHAR(128) NOT NULL,
    account_id UUID NOT NULL REFERENCES accounts(account_id) ON DELETE CASCADE,
    email VARCHAR(255),
    linked_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp(),
    PRIMARY KEY (provider, provider_user_id)
);
```

### 4.2. Phân Hệ Nhân Vật & Huyết Cốt Ma Đồ (Characters & Progression)
```sql
CREATE TABLE characters (
    character_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    account_id UUID NOT NULL REFERENCES accounts(account_id) ON DELETE CASCADE,
    season_league_id VARCHAR(32) NOT NULL, -- e.g., 'SEASON_01_PRIMAL_SCOURGE', 'STANDARD_FORSAKEN'
    character_name VARCHAR(32) NOT NULL UNIQUE,
    character_class VARCHAR(32) NOT NULL,  -- e.g., 'SAVAGE_BERSERKER', 'SHADOW_EXILE', 'ASTRAL_MONK'
    level INT NOT NULL DEFAULT 1,
    experience BIGINT NOT NULL DEFAULT 0,
    current_zone_id VARCHAR(64) NOT NULL DEFAULT 'zone_co_tran_huyet_lan',
    pos_x FLOAT NOT NULL DEFAULT 0.0,
    pos_y FLOAT NOT NULL DEFAULT 0.0,
    pos_z FLOAT NOT NULL DEFAULT 0.0,
    -- Ma trận 1.500 mắt xích Huyết Cốt lưu dưới dạng Protobuf Binary Blob để tối ưu tốc độ nạp
    flesh_bone_matrix_blob BYTES NOT NULL,
    is_dead_hardcore BOOLEAN NOT NULL DEFAULT FALSE,
    created_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp(),
    last_played_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp(),
    INDEX idx_acc_season (account_id, season_league_id)
) INTERLEAVE IN PARENT accounts (account_id);
```
> [!NOTE]
> Bảng `characters` sử dụng tính năng **Interleave** hoặc **Co-location** theo `account_id` trong CockroachDB để đưa toàn bộ dữ liệu của một tài khoản vào cùng một Range máy chủ, giảm thiểu tối đa giao dịch liên máy chủ (Cross-Range Latency).

### 4.3. Phân Hệ Hòm Đồ, Trang Bị & Huyết Thạch (Inventory & Stash Tabs)
```sql
-- Rương đồ cá nhân và Rương Mùa Giải
CREATE TABLE stash_tabs (
    stash_tab_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    account_id UUID NOT NULL REFERENCES accounts(account_id) ON DELETE CASCADE,
    season_league_id VARCHAR(32) NOT NULL,
    tab_index INT NOT NULL,
    tab_name VARCHAR(32) NOT NULL,
    tab_type VARCHAR(20) NOT NULL DEFAULT 'NORMAL', -- NORMAL, CURRENCY_SPECIAL, REMOVE_ONLY, PUBLIC_SALE
    color_hex VARCHAR(8) NOT NULL DEFAULT '#8B0000',
    is_remove_only BOOLEAN NOT NULL DEFAULT FALSE,
    is_public_indexed BOOLEAN NOT NULL DEFAULT FALSE,
    UNIQUE (account_id, season_league_id, tab_index)
);

-- Bảng vật phẩm bất biến (Immutable Items Registry)
CREATE TABLE items (
    item_uuid UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    owner_account_id UUID NOT NULL REFERENCES accounts(account_id),
    current_location VARCHAR(32) NOT NULL, -- 'INVENTORY', 'EQUIPPED', 'STASH_TAB', 'BAZAAR_VAULT', 'GUILD_VAULT'
    stash_tab_id UUID REFERENCES stash_tabs(stash_tab_id),
    slot_x INT NOT NULL DEFAULT 0,
    slot_y INT NOT NULL DEFAULT 0,
    base_item_id VARCHAR(64) NOT NULL,
    item_rarity VARCHAR(20) NOT NULL,      -- 'RAW', 'REFINED', 'SAVAGE', 'PRIMAL_ANCIENT'
    item_level INT NOT NULL DEFAULT 1,
    durability_current INT NOT NULL,
    durability_max INT NOT NULL,
    affixes_json JSONB NOT NULL,           -- Danh sách tiền tố/hậu tố ma võ
    socketed_gems_json JSONB NOT NULL,     -- Danh sách Cổ Cốt & Tà Ấn khảm nạp
    is_corrupted BOOLEAN NOT NULL DEFAULT FALSE,
    is_locked_for_trade BOOLEAN NOT NULL DEFAULT FALSE,
    created_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp()
);
```

### 4.4. Phân Hệ Hắc Thị Hoang Vực & Rương Bang Hội (Bazaar & Guild Stash)
```sql
-- Ký gửi bán đồ tức thì (PoE2 Instant Buyout)
CREATE TABLE outcast_bazaar_listings (
    listing_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    seller_account_id UUID NOT NULL REFERENCES accounts(account_id),
    item_uuid UUID NOT NULL UNIQUE REFERENCES items(item_uuid),
    price_currency VARCHAR(64) NOT NULL, -- e.g., 'HUYET_HON_THACH', 'CO_COT_AN'
    price_amount INT NOT NULL CHECK (price_amount > 0),
    season_league_id VARCHAR(32) NOT NULL,
    status VARCHAR(20) NOT NULL DEFAULT 'ACTIVE', -- 'ACTIVE', 'LOCKED_IN_2PC', 'SOLD', 'CANCELLED'
    listed_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp(),
    INDEX idx_bazaar_search (season_league_id, price_currency, price_amount)
);

-- Rương Bang Hội phân quyền (Guild Shared Stash - 2PC Protected)
CREATE TABLE guild_shared_stash_tabs (
    tab_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    guild_id UUID NOT NULL,
    tab_index INT NOT NULL,
    tab_name VARCHAR(32) NOT NULL,
    min_withdraw_role VARCHAR(20) NOT NULL DEFAULT 'ELDER', -- 'LEADER', 'ELDER', 'MEMBER'
    daily_withdraw_limit INT NOT NULL DEFAULT 5,
    version_lock BIGINT NOT NULL DEFAULT 0, -- Optimistic Concurrency Control (OCC)
    UNIQUE (guild_id, tab_index)
);
```

---

## 5. VÒNG ĐỜI DỮ LIỆU & CƠ CHẾ ĐỒNG BỘ (DATA LIFECYCLE & WRITE PATTERNS)

```mermaid
sequenceDiagram
    autonumber
    actor Player as Người Chơi (Client)
    participant Worker as Zone Simulation Node (RAM 30Hz)
    participant Redis as SQLite (WAL mode) (Lock & Cache)
    participant Kafka as Kafka Event Stream (WAL)
    participant DB as CockroachDB (ACID Store)

    Note over Player, Worker: 1. Thao tác di chuyển & combat (Hot Path)
    Player->>Worker: Gói tin di chuyển / Dùng chiêu
    Worker->>Worker: Mô phỏng vật lý & va chạm trên RAM (0ms disk I/O)

    Note over Player, DB: 2. Thao tác tài sản giá trị cao (Drop đồ hiếm / Giao dịch)
    Player->>Worker: Yêu cầu Mua Tức Thì tại Hắc Thị (Instant Buyout)
    Worker->>Redis: Thâu tóm Redlock (Khóa item & hòm đồ 2PC)
    Worker->>Kafka: Phát tán TradeCommittedEvent (Ghi sổ cái bất biến)
    Worker-->>Player: Trả kết quả thành công tức thì (< 5ms)
    
    Note over Kafka, DB: 3. Tầng Consumer ghi đĩa bất đồng bộ (Write-Behind)
    Kafka->>DB: Ledger Consumer gom Batch Update tài sản vào CockroachDB
    Worker->>Redis: Giải phóng Redlock sau khi hoàn tất

    Note over Worker, DB: 4. Checkpoint định kỳ (Periodic Snapshot)
    loop Mỗi 30-60 giây hoặc khi Logout/Dịch chuyển
        Worker->>DB: Flush Dirty Snapshot (Flesh & Bone Matrix, Quest state)
    end
```

### 5.1. Hot Path: Không Bao Giờ Chạm Đĩa (RAM-First Simulation)
- Toàn bộ vị trí nhân vật, chỉ số HP/MP, va chạm, tầm nhìn AoI được tính toán hoàn toàn trên RAM của Zone Worker bằng lõi C++ Native SIMD ([`freeexile_sim_core.dll`](file:///c:/Projects/FreeExile/server/engine_native/freeexile_sim_core.dll)).
- Tuyệt đối **không gọi câu lệnh SQL** trong vòng lặp tick $33.33\text{ ms}$.

### 5.2. Biến Động Tài Sản: Event-First Logging (Synchronous Kafka Write)
- Khi có vật phẩm rơi ra đất, đập đá huyết hoặc giao dịch thành công:
  1. Zone Worker tạo một bản ghi Event bất biến (ví dụ `ItemMintedEvent`).
  2. Ghi đồng bộ (Synchronous) vào Kafka cụm nội bộ (mất $< 1.5\text{ms}$).
  3. Sau khi Kafka xác nhận (ACK all in-sync replicas), Worker mới xác nhận với Client.
  4. Nếu cụm Game Server Node sập nguồn đột ngột, toàn bộ tài sản được tái thiết lập 100% nhờ Replay Kafka Log.

### 5.3. Checkpoint & Snapshotting (Write-Behind Queue)
- **Snapshot Định Kỳ**: Cứ mỗi $30\text{ giây}$, các Worker Thread đánh dấu các thực thể có thay đổi (`dirty entities`) và gửi snapshot nén xuống hàng đợi ghi bất đồng bộ (Write-Behind Worker Pool).
- **Snapshot Sự Kiện Quan Trọng**: Khi người chơi bấm thoát game, chuyển map (qua cổng dịch chuyển Astral Portal), hoặc chết trong chế độ Hardcore, hệ thống thực hiện đồng bộ snapshot ngay lập tức trước khi đóng session.

---

## 6. CHIẾN LƯỢC PHÂN MẢNH & TÍNH TOÀN VẸN (SHARDING & ANTI-DUPE 2PC)

### 6.1. Sharding Theo Tài Khoản & Mùa Giải (Range Sharding)
- CockroachDB tự động chia nhỏ các bảng theo phạm vi khóa (Range Spans $64\text{MB}$).
- Bằng cách định nghĩa khóa chính có tiền tố `(account_id, ...)`, tất cả nhân vật, hòm đồ, trang bị của một người chơi luôn nằm trên cùng một Node vật lý trong cụm CockroachDB.
- **Lợi ích**: Giao dịch nội bộ của một tài khoản (chuyển đồ từ hành trang vào rương) chỉ là **Single-Raft Commit**, loại bỏ hoàn toàn chi phí đàm phán 2PC liên cụm máy chủ.

### 6.2. Thuật Toán Chống Nhân Bản Vật Phẩm (Zero-Dupe 2PC Engine)
- Giao dịch liên tài khoản tại Hắc Thị Hoang Vực được kiểm soát bằng giao thức **SQLite Exclusive 2PC**:
  1. **Phase 1 (Prepare & Lock)**:
     - Mở giao dịch `BEGIN EXCLUSIVE TRANSACTION` trên SQLite Trade Ledger để chiếm quyền ghi duy nhất.
     - Kiểm tra sự tồn tại của vật phẩm, trạng thái `is_locked`, và số dư tiền người mua.
  2. **Phase 2 (Commit & Transfer)**:
     - Chuyển quyền sở hữu `owner_account_id` của item và khấu trừ currency đồng thời trong SQLite.
     - Nếu một trong hai bên gặp sự cố (thiếu tiền, đồ đã bị mua): Tự động Rollback, không bên nào mất tài sản và không có item ảo sinh ra.

---

## 7. QUẢN LÝ DỮ LIỆU MÙA GIẢI & CHUYỂN SINH (SEASONAL DATA MIGRATION)

Tuân thủ mô hình mùa giải công bằng của Path of Exile 2:
1. **Khởi Đầu Mùa Mới (Clean Slate Initialization)**:
   - Khi Mùa Giải mới khởi tranh (ví dụ `SEASON_02`), tạo phân vùng rương và nhân vật độc lập với `season_league_id = 'SEASON_02'`.
   - Người chơi bắt đầu ở Cấp 1, $0$ tiền tệ, $0$ trang bị, không có bất kỳ lợi thế tích lũy nào từ mùa trước.
2. **Hợp Nhất Cuối Mùa (End-of-Season Merger Protocol)**:
   - Các nhân vật mùa giải được tự động cập nhật `season_league_id = 'STANDARD_FORSAKEN'` (Cõi Bị Lãng Quên).
   - Toàn bộ các Tab Rương mùa giải được gắn cờ `is_remove_only = TRUE`.
   - **Quy tắc Tab Chỉ Rút (Remove-Only)**: Người chơi có thể lấy vật phẩm ra bất cứ lúc nào để sử dụng ở Cõi Bị Lãng Quên, nhưng **tuyệt đối không thể cất ngược đồ vào các tab này**. Khi tab được rút cạn, hệ thống tự động giải phóng bản ghi trong cơ sở dữ liệu.

---

## 8. CHỈ TIÊU KỸ THUẬT & AN TOÀN DỮ LIỆU (SLA & RECOVERY TARGETS)

| Chỉ Tiêu Kỹ Thuật | Cam Kết Kỹ Thuật (SLA) | Cơ Chế Bảo Đảm |
| :--- | :--- | :--- |
| **RPO (Recovery Point Objective)** | **$0\text{ giây}$ (Zero Data Loss)** | Kafka Replication Factor = 3 (Multi-AZ), CockroachDB Raft Consensus. |
| **RTO (Recovery Time Objective)** | **$< 5\text{ giây}$** | Tự động chuyển đổi Master/Leaseholder trong Multi-Raft mà không cần can thiệp thủ công. |
| **Độ trễ Đọc Cache (Read Latency)** | **p99 $< 1\text{ms}$** | Redis Enterprise In-Memory Cache. |
| **Độ trễ Giao dịch (Write Latency)** | **p99 $< 15\text{ms}$** | Multi-Raft NewSQL Local Quorum Write. |
| **Bảo Vệ Tính Toàn Vẹn Tài Sản** | **$100\%$ Chống Dupe / Hack Số Dư** | Event Sourcing bất biến + Redis Redlock 2PC + Audit Trail ScyllaDB. |

---

## 9. TỔNG KẾT

Hệ thống cơ sở dữ liệu máy chủ của **FreeExile** không phụ thuộc vào một giải pháp đơn khối, mà là sự hiệp đồng chặt chẽ giữa **Lõi Tính Toán Hot-Memory**, **Sổ Cái Bất Biến Kafka**, **CSDL Phân Tán Chuẩn ACID CockroachDB**, và **Kho Lưu Trữ Nhật Ký ScyllaDB**. Kiến trúc này đảm bảo trò chơi có thể mở rộng tuyến tính từ $10.000$ lên tới **$1.000.000+\text{ CCU}$** mà không bao giờ gặp nguy cơ mất mát dữ liệu, lạm phát ảo hay nghẽn cổ chai hệ thống.
