Bọc Giáp Go & Bóp Cổ API (Rate Limiting) — Xô Nhận Thẻ (Token Bucket), Xô Lủng Đáy (Leaky Bucket) & Bùa Redis Lua

Điều kiện tiên quyết: Đây là Phần 11 của Khóa Học System Design. Mấy hồi trước hì hục xây đắp xương sống lõi cốt (core components) — hồi này vác khiên bọc giáp cho mớ APIs và múa roi quất dẹp loạn bọn khách sộp ùa dâng ngập lụt (traffic spikes) lúc phình bành. Answer-first: Đòn bóp cổ nặn API (API rate limiting) bọc hậu bảo kê ba cái mỏ dịch vụ (backend services) bằng cách siết cổ vặn vòi lượng rác ọc vô (request volume). An ninh phòng thủ bắt buộc xài trò nhồi lô cốt n lớp (layered defense): Tiền đồn Tường Lửa WAF đập vỡ mõm bầy sóng thần dâng lụt trào (volumetric spikes) ngay ngưỡng cửa, Trạm Gác API Gateways cầm trịch vé tàu (credentials) và mâm cỗ (quotas) ở L7, và cuối cùng bọn bảo kê gầm giường (application middleware) nắm chốt siết gắt gao mớ luật mần ăn chi li (fine-grained business limits). Đòi móc mả vạch mặt thằng khách (client identification) thì phải ngậm bùa bắt IP tróc gốc, bảo mật kín kẽ (xài chiêu PROXY protocol hoặc lột sụn bấu vô cái chót X-Forwarded-For chót lọt tận mép phải). ...

18 tháng 6, 2026 · 16 phút · Tanh

Bùa Vẽ API Cản Đúp Trong Go (Idempotent API Design) — Chìa Khóa Cản Đúp & Lưới Lọc Redis SetNX

Điều kiện tiên quyết: Đây là Phần 7 của Khóa Học System Design. Lội ngược dòng Phần 6: Khóa Phân Tán — ba cái trò chặn cửa tụi vãng lai đúp bóng (concurrent duplicate request blocking) múa may chung một mâm pháp bảo trói gô chèn ép (mutual exclusion primitives). Answer-first: Đạo luật cản đúp API (API idempotency) vả vỡ mồm thề sống chết (ensures) phán rằng hễ lỡ tay chọt nút thử lại y boong mớ rác (retrying an identical request - móc chung thẻ Idempotency-Key) thì không bao giờ đẻ thêm trứng rơi vãi họa ngoài lề (additional side effects) lấn quá cái vạch chốt hạ của lần chọc đầu tiên (first execution). Miếng bùa này là thứ lõi móng cốt tử cho mấy cái cống rút tiền (payment APIs) nơi bão mạng đứt gãy bắt ép tụi khách chọc lút cán đập cửa (client retries), và nhỡ rách việc lọt lưới 1 cú nháy đúp (duplicate execution) thì đồng nghĩa với màn phang x2 cướp tiền thiên hạ (double charge). ...

18 tháng 6, 2026 · 14 phút · Tanh

Khóa Phân Tán (Distributed Locks) Trong Go — Toán Học Redlock, etcd & Chứng Phân Liệt Split-Brain

Điều kiện tiên quyết: Đây là Phần 6 của Khóa Học System Design. Bơi ngược lại Phần 5: Kafka & Bám Đuôi Sự Kiện để nhồi nhét mấy cái trò mồi rác sự kiện (event sourcing) trước khi xắn tay vào cùm gông khóa mõm. Answer-first: Đám khóa phân tán (Distributed locks) được đẻ ra để giàn xếp cái nợ đòi độc chiếm cắn xé nhau (mutual exclusion problem) chéo qua vắt lại giữa 1 nùi server độc lập — trói gô lại (ensuring) bắt buộc chỉ chừa đúng nháy 1 thằng server thò mõm vào cắn cấu một bãi rác dùng chung (shared resource) tại 1 thời điểm. Cái bùa Redlock của nhà Redis quăng ra cái ổ khóa chạy bạt mạng đua xe (high-performance) xài chiêu trò kéo bè kéo cánh số đông (majority quorum) rải rác đè đầu mớ node master; Thằng etcd lại vỗ ngực xưng tên ban phát bùa hộ mệnh sống chết chắc nịch (stronger guarantees) nhờ cái giao ước máu Raft (Raft consensus) đổi lại phải nôn tiền trả giá bằng độ lề mề lê lết (higher latency). ...

18 tháng 6, 2026 · 16 phút · Tanh

Chiến Lược Caching Trong Go — Hội Chứng Cache Stampede, XFetch & Redis LFU

Điều kiện tiên quyết: Đây là Phần 3 của Khóa Học System Design. Hãy nghiền ngẫm Phần 2: Cân Bằng Tải L4/L7 để hiểu thấu cái mớ bòng bong tầng traffic trước khi nhảy cắm đầu xuống cái vực thẳm caching. Answer-first: Đỉnh cao của nghệ thuật xài bùa (caching strategy selection) phụ thuộc vào hai chữ: bạn chịu đựng được mức sai số đồng bộ (consistency window) bao lâu và cái nết đọc/ghi (read/write access pattern) của cái đống dữ liệu đó thế nào. Ghi-Xuyên-Thấu (Write-Through) là đo ni đóng giày cho mớ sổ sách tiền bạc; Ghi-Lùi-Sau (Write-Behind) lại là chân ái của đám đếm view đếm click hay gom rác phân tích (analytics); Ghi-Vào-Rồi-Đọc (Cache-Aside) thì nghiễm nhiên là trùm cuối (default) cho mấy cái API suốt ngày ngửa cổ chờ đọc dồn dập. ...

18 tháng 6, 2026 · 19 phút · Tanh

Phần 6: Gom Nhóm Vị Trí Với Uber H3 & Caching Ngữ Nghĩa (Semantic Caching) Bằng Redis

Cái trò lôi nguyên si một tọa độ GPS chính xác ra mà đem đi cache là một nhiệm vụ bất khả thi (impossible). Bởi vì mấy cái số thực dấu phẩy động (floating-point numbers) nó chính xác tới mức vô tận, hai ông khách dù đứng cách nhau vỏn vẹn 1 mét thì tọa độ cũng đã trật lất hoàn toàn (106.0001 so với 106.0002). Nếu bạn ngây thơ nặn cái khóa Redis (Redis key) kiểu mộc mạc như lat1,lng1:lat2,lng2, thì tỷ lệ trúng Cache (Cache Hit Rate) nhà bạn muôn đời sẽ đội sổ ở mức 0%. ...

15 tháng 6, 2026 · 7 phút · Tuan Anh

Phần 3: Chỉ Mục Không Gian (Uber H3, PostGIS & Redis GEO)

Một lỗi chí mạng ngây ngô của mấy bạn junior khi xây mấy cái app gọi xe là cắm thẳng cái API Gateway vào luôn Hệ thống Định tuyến (Routing Engine). Answer-first: Graphhopper là một con quái vật ngốn CPU cực bạo (CPU-intensive). Nếu bạn bắt nó tính thời gian dự kiến (ETA) tới tận 10,000 ông tài xế đang online trong thành phố, mấy con server nhà bạn sẽ tan chảy theo đúng nghĩa đen. Bạn bắt buộc phải nhét Chỉ Mục Không Gian (Spatial Indexing) (như Uber H3 hay Redis GEO) vào làm “Màng lọc thô” (Pre-filter) siêu tốc độ. Cái chỉ mục này sẽ bới bèo ra bọ tìm cho ra 50 tài xế gần nhất “theo đường chim bay” chạy trơn tru trên RAM, và chỉ 50 mạng đó mới được đẩy xuống cho Graphhopper cày ải tính toán ETA nặng nề. ...

14 tháng 6, 2026 · 9 phút · Tuan Anh

Chương 8: Distributed Locking Xử Lý Tranh Chấp Race Conditions: Redlock Đấu Với ZooKeeper

← Bài trước | Series hub | Tiếp theo → Chương 8: Đồng Bộ Hóa Clusters Bằng Distributed Locks Bên trong một ứng dụng Go chạy cô lập (standalone), để tránh chuyện hai Goroutines giành giật dẫm đạp lên nhau ghi đè chung một cục dữ liệu (Race Condition), người ta hay viện đến gã gác cửa sync.Mutex. Xui thay, lúc hệ thống của bạn phình to rải quân ra tận 10 servers nấp sau lưng một gã Load Balancer, cái sync.Mutex bỗng hóa thứ đồ bỏ vì nó chỉ khóa được mỗi cục RAM nội bộ của nhà nó. Bạn sẽ phải mưu cầu một thứ lớn lao hơn: Distributed Lock (Khóa phân tán). ...

9 tháng 6, 2026 · 6 phút · Tuan Anh

Chương 7: Thiết Kế Idempotency APIs Dành Cho Hệ Thống Thanh Toán

← Bài trước | Series hub | Tiếp theo → Chương 7: Củng Cố Nền Tảng Thanh Toán Bằng Idempotent APIs Trong thế giới E-commerce hay Fintech, cơn ác mộng kinh hoàng nhất không phải là chuyện sập hệ thống, mà là trừ tiền một khách hàng tới hai lần cho cùng một hóa đơn. Cớ sự thường bắt nguồn từ mạng lag, do khách hàng sốt ruột ấn “Pay” (Thanh toán) lặp đi lặp lại, hoặc do thuật toán retry (thử lại) dập máy móc của app. ...

9 tháng 6, 2026 · 6 phút · Tuan Anh

Chương 3: Distributed Rate Limiting Với Redis & Thuật Toán GCRA

← Bài trước | Series hub | Tiếp theo → Chương 3: Bảo Mật APIs Bằng Distributed Rate Limiting Nếu caching là tấm khiên che chở cơ sở dữ liệu, thì Rate Limiting (giới hạn lưu lượng) lại là bộ giáp che chắn cho các máy chủ API của bạn khỏi các cuộc tấn công DDoS và tình trạng cạn kiệt tài nguyên gây ra bởi những clients lạm dụng. Tại Sao Local Rate Limiting Thất Bại Trong Microservices Answer-first: Các hệ thống limiters lưu trên RAM cục bộ (local RAM) thất bại bởi vì Load Balancers có nhiệm vụ phân tán traffic ra nhiều nodes. Một người dùng được cấp hạn mức 100 req/sec hoàn toàn có thể lợi dụng một cluster 5 nodes để gửi thốc 500 req/sec, dễ dàng chọc thủng hàng rào giới hạn. Việc gom trạng thái tập trung (Centralized state) qua Redis là bắt buộc. ...

9 tháng 6, 2026 · 5 phút · Tuan Anh

Chương 2: 3 Điểm Yếu Của Caching (Penetration, Breakdown, Avalanche) & Kỹ Thuật Go Singleflight

← Bài trước | Series hub | Tiếp theo → Chương 2: 3 Điểm Yếu Tử Huyệt Nhất Của Cache Caching là tấm khiên phòng ngự tối thượng bảo vệ các cơ sở dữ liệu trong hệ thống phân tán. Tuy nhiên, nếu triển khai cẩu thả, cache lại chính là nguyên nhân trực tiếp kéo sập toàn bộ hệ thống của bạn. Trong chương này, chúng ta sẽ mổ xẻ ba hiện tượng kinh điển về caching và cách chống lại chúng bằng Golang. ...

9 tháng 6, 2026 · 5 phút · Tuan Anh

Đồng Bộ Tồn Kho Thời Gian Thực: Kafka, CDC & Redis cho E-commerce

🇬🇧 Read the English version of this article on tanhdev.com Đồng Bộ Tồn Kho Thời Gian Thực Là Gì? Answer-first: Đồng bộ tồn kho thời gian thực (Real-time inventory synchronization) là quá trình lan truyền các thay đổi về số lượng hàng trong kho từ hệ thống gốc (database) tới tất cả các kênh bán hàng — web storefront, ứng dụng mobile, WMS, ERP — với độ trễ chưa tới một giây (sub-second). Thay vì phải phụ thuộc vào các tác vụ batch ETL chạy mỗi giờ, một pipeline CDC + Kafka sẽ stream mọi thay đổi tồn kho được commit thành một sự kiện (event), qua đó loại bỏ hoàn toàn tình trạng bán vượt mức (overselling) cũng như tránh hiển thị sai số lượng hàng hóa. ...

8 tháng 6, 2026 · 15 phút · Tuan Anh

Kiến Trúc Thuật Toán Giá Bão (Surge Pricing) & Mạng Không Gian

🇬🇧 Read the English version of this article on tanhdev.com Hỏi khí không phải, sao cứ hễ trời ụp cơn mưa, giá xe vọt gấp đôi, hay tới nóc gấp 3? Chả phải có khứa nào ngồi gác chân bóp gõ đổi giá đằng sau cái màn hình đâu. Rặt là 1 cỗ máy xào luồng thời gian thực (Stream Processing engine) khủng khiếp lẩn khuất đang cạp 1 cái thuật toán Giá Bão (surge pricing algorithm) đó. ...

1 tháng 6, 2026 · 9 phút · Tuan Anh

Kiến Trúc Shopee Flash Sale: Ngắt Họng & Redis

🇬🇧 Read the English version of this article on tanhdev.com Điểm đúng boong 0 giờ mùa 11.11, cái rớ con nghiện Shopee tuốt tuột dải Đông Nam Á với Đài Loan đè ngón vô xào chung 1 cái nút bấm nẩy. Độc trong 10 giây nòng châm hỏa (first 10 seconds) của 1 cái mùa săn sale chớp nhoáng (flash sale), 1 cái trang quầy rác (single product page) có thể bị cả triệu mống (millions of concurrent sessions) nã liên thanh — bu xâu nhào zô giành mớ 1,000 nhúm đồ lổn nhổn nhét kho (inventory). Thẩy lố 1 cục (One oversell), đứt bóng 1 cục máy (server crash), hay cái cục kho quẹt chết lâm sàng (database deadlock) lọt chỏm ở khúc đó hất đổ 1 sớ ná thở đâm chọc móc tiền (cascade of chargebacks), rớ con dân nhảy đổng (angry users), dìm mặt ụp bãi rác tờ đầu mốc nhép giang hồ bới (front-page news headlines). ...

1 tháng 6, 2026 · 19 phút · Tuan Anh