Hệ thống lớn: công nghệ và cách giải bài toán khó
Mỗi bài mổ xẻ một hệ thống lớn thật: bài toán khó họ gặp, công nghệ họ chọn, và cách họ giải — kèm demo kỹ thuật cốt lõi chạy được, có trích nguồn.
12/12 phần đã đăng
Kiến trúc hệ thống
1
Discord lưu hàng nghìn tỷ tin nhắn: chống hot partition, đo THẬT trên ScyllaDB
Discord chứa hàng nghìn tỷ tin nhắn. Bài toán khó: một kênh nóng biến thành một partition khổng lồ. Cách giải: khoá phân mảnh (channel_id, bucket). Bài này dựng THẬT trên ScyllaDB, tạo cả hai schema và dùng nodetool đo trực tiếp: partition nóng 315KB/14.237 cell với đọc 2.106µs, còn bucket chỉ 29KB/1.109 cell đọc 207µs.
22/09/2026
· 6 phút đọc
2
Consistent hashing: cách Amazon Dynamo chia dữ liệu, dựng THẬT trên Redis Cluster
Chia khoá cho N node bằng hash%N nghe hợp lý — cho tới khi thêm một node và gần như MỌI khoá phải chuyển chỗ. Dynamo (2007) giải bằng consistent hashing. Bài này dựng THẬT một Redis Cluster 3 node (16384 hash slot), nạp 20.000 khoá, thêm node thứ 4 và đo trực tiếp: chỉ 24,9% khoá phải dời (~1/N) thay vì ~75% của modulo.
22/09/2026
· 6 phút đọc
3
Kafka và log phân tán: chạy THẬT và đo 1,25 triệu message/giây trên một broker
Kafka ghi xuống đĩa mà vẫn ingest hàng triệu message/giây. Bí quyết là một lựa chọn cấu trúc: log chỉ-thêm-vào-cuối biến mọi ghi thành tuần tự, cộng page cache và zero-copy. Bài này chạy THẬT Kafka 3.8 và đo bằng chính công cụ perf của Kafka: producer 1.253.132 records/giây (119,51 MB/s), consumer 1.139.211 msg/giây.
22/09/2026
· 5 phút đọc
4
Uber tìm tài xế gần bạn thế nào: geospatial index chạy THẬT trên Redis GEO
Ghép khách với tài xế không thể so khoảng cách tới cả triệu tài xế mỗi lần. Bài này dựng THẬT một chỉ mục không gian trên Redis GEO (dùng geohash), nạp 500.000 tài xế và đo trực tiếp: GEOSEARCH trả lân cận đã sắp theo khoảng cách, 13.368 truy vấn/giây p50 3,6ms, index 42MB. Và vì sao Uber tự xây H3 lục giác.
22/09/2026
· 6 phút đọc
5
Dựng feed như Twitter/X trên Redis THẬT: fanout ghi vs đọc và bài toán người nổi tiếng
Timeline phải trả về tức thì dù bạn theo dõi hàng nghìn người. Bài này dựng feed THẬT trên Redis: push bằng LPUSH, đọc bằng LRANGE. Đo trực tiếp: một tweet của sao 50 triệu follower = 50 triệu LPUSH ~ 138 giây fanout cho MỘT tweet. Và cách hybrid push-người-thường / pull-người-nổi-tiếng cứu hệ thống.
22/09/2026
· 6 phút đọc
6
Cloudflare giới hạn tần suất ở biên: dựng sliding window counter THẬT trên Redis
Rate limit ở biên phải chạy cho hàng triệu danh tính mà vừa chính xác vừa cực rẻ RAM. Fixed window cho lọt gấp đôi ở ranh giới; log chính xác ngốn RAM. Bài này dựng sliding window counter kiểu Cloudflare chạy THẬT trên Redis bằng script Lua nguyên tử — đo trực tiếp: fixed cho lọt 200, sliding chặn ở 102; và MEMORY USAGE thật 96 byte vs hơn 1 MB.
22/09/2026
· 8 phút đọc
7
Stripe idempotency key: vì sao retry thanh toán không tính tiền bạn hai lần
Mạng chập chờn khiến client retry — và với thanh toán, retry ngây thơ nghĩa là tính tiền hai lần. Stripe giải bằng Idempotency-Key: lưu kết quả lần đầu, request trùng key trả lại kết quả cũ mà không thực thi lại. Bài này dựng THẬT trên Redis bằng Lua atomic và đo: có idempotency trừ tiền 1 lần, không có thì 5 lần.
22/09/2026
· 6 phút đọc
8
Instagram sinh ID phân tán: 64 bit gói cả thời gian, shard và thứ tự
Ở quy mô sharded, cần ID duy nhất mà không có điểm sinh trung tâm (nút thắt). Instagram gói vào 64 bit: 41 bit timestamp + 13 bit shard + 10 bit sequence, sinh ngay trong Postgres bằng PL/pgSQL. Bài này dựng THẬT đúng scheme đó: ID tăng theo thời gian, 50.000 ID không trùng, và trích được shard từ chính con số ID.
22/09/2026
· 5 phút đọc
9
Google Bigtable dùng bloom filter: cấu trúc tí hon cứu vô số lượt tra đĩa
Đọc một khoá không tồn tại trong LSM-store phải tra nhiều SSTable trên đĩa — rất phí. Bigtable đặt một bloom filter trong RAM cho mỗi SSTable để trả lời rẻ tiền 'khoá này chắc chắn không có'. Bài này dựng THẬT bằng RedisBloom: 1 triệu khoá, dương giả 0,5%, không bao giờ âm giả, và nhỏ hơn SET ~41 lần.
22/09/2026
· 5 phút đọc
10
Tìm kiếm toàn văn như Elasticsearch: inverted index đánh bại LIKE ~1000 lần
LIKE '%từ%' phải quét từng bản ghi — O(n), không index được. Elasticsearch (và Lucene) dùng inverted index: ánh xạ từ tới danh sách tài liệu chứa nó. Bài này dựng THẬT trong PostgreSQL bằng tsvector + GIN và đo EXPLAIN ANALYZE: cùng kết quả nhưng inverted index nhanh hơn ~1092 lần trên 500.000 tài liệu.
22/09/2026
· 5 phút đọc
11
Stack Overflow cân bằng tải với HAProxy: chia tải và tự loại máy chủ chết
Một máy chủ không chịu nổi tải, và máy chủ thì có lúc chết. HAProxy chia request ra nhiều backend và dùng health check tự loại backend hỏng mà không rớt request. Bài này dựng THẬT HAProxy + 3 backend: round-robin chia 4/4/4, giết một backend thì tự dồn 6/6 không lỗi 5xx, bật lại thì tự quay vào pool.
22/09/2026
· 5 phút đọc
12
PgBouncer gộp kết nối: vì sao ngàn kết nối làm sập PostgreSQL, và cách cứu
Mỗi kết nối PostgreSQL là một process riêng tốn RAM, và max_connections có trần cứng — ngàn client làm cạn kết nối, database từ chối. PgBouncer đứng giữa, gộp nhiều client vào một pool nhỏ. Bài này dựng THẬT Postgres + PgBouncer: 30 client chỉ thành 5 backend, và đo chi phí thiết lập kết nối đắt gấp 50 lần giữ kết nối.
22/09/2026
· 6 phút đọc