Rate Limiting — Vũ khí bảo vệ API không thể thiếu
Mở đầu
Ảnh: ThisIsEngineering — Pexels
Mấy bạn có bao giờ tự hỏi tại sao mấy API lớn như Twitter, Google, GitHub lại có cái giới hạn gọi API (rate limit) không? Hôm nay mình muốn kể về rate limiting — một khái niệm system design mà backend dev nào cũng nên biết. Nói nôm na, rate limiting là kỹ thuật giới hạn số request trong một khoảng thời gian, để API khỏi bị quá tải hay bị spam.
Tại sao cần rate limiting?
Thiệt tình, không có rate limiting thì API của bạn dễ bị tấn công DDoS, brute force, hay chỉ đơn giản là một thằng bạn viết code loop quên break cũng đủ làm sập server. Ngoài ra, nó còn giúp phân phối tài nguyên công bằng giữa các user — ai cũng có phần, không ai chiếm hết. Nghe công bằng ha.
Các thuật toán phổ biến
Ảnh: Marvin — Pexels
Có mấy cách implement rate limiting, mỗi cách có ưu nhược riêng:
- Token Bucket: Bỏ token vào bucket với tốc độ cố định, mỗi request xài 1 token. Nếu bucket rỗng thì từ chối. Dễ hiểu, xài nhiều nhất.
- Leaky Bucket: Request vào hàng đợi, xử lý với tốc độ cố định. Giống cái thùng bị thủng lỗ — nước vào nhanh hơn ra thì tràn.
- Fixed Window: Chia thời gian thành từng khung (VD 1 phút), mỗi khung được X request. Dễ code nhưng có vấn đề ở biên giới giữa các khung.
- Sliding Window Log: Ghi log từng request, đếm số request trong khoảng thời gian trượt. Chính xác nhưng tốn bộ nhớ.
Triển khai thực tế
Trong thực tế, mấy dịch vụ lớn thường dùng kết hợp nhiều thuật toán. Ví dụ, GitHub dùng Token Bucket, còn AWS thì dùng sliding window kết hợp với credit-based system. Nếu bạn code .NET, có thể dùng middleware như AspNetCoreRateLimit. Còn nếu dùng API gateway như Kong, NGINX hay Envoy thì họ hỗ trợ sẵn.
Kết
Rate limiting nghe thì đơn giản, nhưng implement đúng cách không dễ đâu. Chọn sai thuật toán có thể làm user bực mình vì bị chặn oan, hoặc API vẫn bị quá tải. Mình nghĩ dev nào cũng nên hiểu ít nhất Token Bucket và Fixed Window — đó là nền tảng để đi xa hơn. Có bạn nào từng implement rate limiting chưa? Chia sẻ với mình dưới comment nha!
📋 Phụ lục thuật ngữ
- Rate Limiting — kỹ thuật giới hạn số request trong 1 khoảng thời gian
- Token Bucket — thuật toán dùng token được nạp đều đặn, mỗi request xài 1 token
- Leaky Bucket — hàng đợi xử lý request với tốc độ cố định, tràn nếu quá tải
- Fixed Window — chia thời gian thành khung, mỗi khung có hạn mức request
- Sliding Window — dùng log hoặc counter để đếm request trong khoảng thời gian trượt liên tục