Chương 1: Xuyên Phá Rào Cản C10M
Để kiến tạo một hệ thống đủ sức gánh vác hàng triệu Requests Per Second (RPS) — hay còn gọi là bài toán C10M — vertical scaling (tăng cấu hình) không bao giờ là đủ. Nó đòi hỏi một Kiến Trúc Phân Tán (Distributed Architecture) được thiết kế tỉ mỉ.
1. Bước Chuyển Giao Từ C10K Sang C10M
Answer-first: Trong khi C10K được hóa giải bằng mô hình non-blocking I/O (như NGINX), C10M lại chuyển điểm thắt cổ chai về phía OS kernel (nhân hệ điều hành). Các hệ thống buộc phải bỏ qua kernel (Kernel Bypass) bằng cách dùng DPDK hoặc XDP mới có thể xử lý 10 triệu kết nối mượt mà.
Bài toán C10K (10.000 kết nối) từng là cơn ác mộng của giới kỹ sư hồi đầu những năm 2000. Nó đã bị triệt tiêu hoàn toàn nhờ các mô hình Non-blocking I/O (epoll, kqueue) cùng NGINX. Với ngôn ngữ Golang, các siêu tiểu trình Goroutines siêu nhẹ và cơ chế I/O multiplexing tích hợp sẵn trong runtime biến C10K trở thành chuyện nhỏ.
Dẫu vậy, C10M (10.000.000 kết nối) lại là một con quái vật thuộc thế giới khác. Điểm thắt cổ chai không còn nằm ở giới hạn RAM của tiến trình; nó chính là Operating System Kernel (Context Switching, Interrupts). Các hệ thống C10M thường ứng dụng các kỹ thuật “Kernel Bypass” qua DPDK (Data Plane Development Kit) để đọc packets trực tiếp thẳng từ card mạng.
2. Stateless APIs & Quản Lý Trạng Thái
Answer-first: Tôn chỉ tối cao của high-concurrency là đảm bảo tầng API phải hoàn toàn stateless (phi trạng thái). Toàn bộ dữ liệu session (phiên) và cart (giỏ hàng) bắt buộc phải dồn trút sang các bộ lưu trữ ngoài siêu tốc như Redis.
Từng cái HTTP Request phải hoàn toàn độc lập. Cấm tuyệt đối việc nhét thông tin session người dùng hay giỏ hàng vào thẳng RAM của application. Đẩy trạng thái (State) sang một datastore bên ngoài cho phép bạn thoải mái scale out hàng ngàn Kubernetes Pods mà chẳng cần bận tâm. Nếu Load Balancer lỡ điều chuyển traffic, khách hàng cũng chẳng bao giờ bị văng session.
3. Bài Học Thực Tế: Shopee Flash Sales
Answer-first: Shopee sống sót qua các đợt Flash Sales là nhờ trang bị multi-level caching (cache cục bộ + phân tán), các Atomic Lua scripts để khấu trừ tồn kho, và luồng xử lý bất đồng bộ thông qua Message Queues.
Flash sales chính là phép thử stress test tối thượng: chục triệu con người tranh nhau xâu xé một món hàng chỉ trong phần nghìn giây.
- Multi-Level Caching:
- Tier 1 (Local Cache): Tận dụng RAM của API server (ví dụ:
sync.Maptrong Go) để ghim một lá cờ “Out of Stock” (Hết hàng). Một khi cờ đã phất, các request bị đánh bật lập tức mà không thèm gọi xuống mạng. - Tier 2 (Distributed Cache): Dùng Redis đếm số tồn kho theo thời gian thực.
- Tier 1 (Local Cache): Tận dụng RAM của API server (ví dụ:
- Thao Tác Atomic (Lua Script): Để dập tắt thảm họa overselling (bán quá số lượng), Shopee thực thi các Lua scripts ở bên trong Redis. Bởi vì Redis chạy luồng đơn (single-threaded), Lua scripts cam kết tính nguyên tử (atomicity) tuyệt đối.
- Xử Lý Bất Đồng Bộ (Asynchronous Processing): Sau khi khấu trừ Redis thành công, hệ thống liền thả (publish) một event sang Kafka. Một nhóm worker lẳng lặng chạy ngầm phía sau dần dà bốc các sự kiện để chép (persist) đơn hàng vào Database. Cách này triệt tiêu hoàn toàn điểm tắc nghẽn của database.
sequenceDiagram
participant User
participant LocalCache as Local Cache (RAM)
participant Redis as Distributed Cache
participant MQ as Kafka / RabbitMQ
participant DB as Database
User->>LocalCache: Nhấn Mua Hàng
alt Món Hàng Đã Báo Hết Ở Local Cache
LocalCache-->>User: Thất Bại Tức Thì (Hết Hàng)
else Món Hàng Còn Số Lượng
LocalCache->>Redis: Chạy Lua Script (Trừ Tồn Kho)
alt Tồn Kho Redis > 0
Redis-->>LocalCache: Thành Công
LocalCache-)MQ: Bắn Order Event (Bất Đồng Bộ)
LocalCache-->>User: Thành Công (Đang Xử Lý)
MQ-)DB: Worker Chép Order (Chậm)
else Tồn Kho Redis == 0
Redis-->>LocalCache: Thất Bại
LocalCache-->>User: Hết Hàng
end
end
4. Kiến Trúc LDC Double 11 Của Alipay
Answer-first: Alipay kham nổi 544.000 TPS bằng việc nhổ bỏ Oracle DBs nguyên khối để thay bằng OceanBase, kết hợp tận dụng kiến trúc Logical Data Center (LDC) nhằm băm (shard) traffic người dùng theo khu vực địa lý.
Trong kỳ lễ hội mua sắm Double 11, Alipay thiết lập kỷ lục 544.000 TPS (Transactions Per Second). Họ làm nên lịch sử nhờ mạnh tay ruồng bỏ hệ quản trị Oracle truyền thống để sáp nhập OceanBase — hệ quản trị Distributed DB riêng.
Alipay rải quân bằng kiến trúc LDC (Logical Data Center). Dữ liệu người dùng bị băm (sharded) theo ID và cấp phát về nhiều datacenters luận lý khác nhau. Hễ khách hàng ở Hà Nội quẹt thẻ, transaction lao thẳng tắp về datacenter đang giữ mảnh shard của họ, cứu nguy hệ thống khỏi việc một server máy chủ trung tâm đơn độc bị đánh sập.
Kết Luận
Để sống sót qua hàng triệu requests, hệ thống của bạn nhất thiết phải là Distributed, Asynchronous, và Cache-Protected. Ở chương tiếp theo, chúng ta sẽ cùng khám phá 3 điểm yếu chí mạng nhất của cache và cách Golang vô hiệu hóa chúng bằng thủ thuật singleflight.