Khi xây dựng hoặc làm việc với các hệ thống mạng và web service, chắc hẳn bạn đã từng nghe đến khái niệm "Rate Limit". Vậy thực chất nó là gì và hoạt động ra sao? Hãy cùng tìm hiểu nhé!
API rate limit là một phương pháp để một dịch vụ web kiểm soát số lượng request (yêu cầu) mà một người dùng hoặc một ứng dụng có thể thực hiện trong một đơn vị thời gian được xác định.
Việc giới hạn tốc độ này đóng vai trò vô cùng quan trọng đối với hệ thống vì những lý do sau:
- Tránh tình trạng máy chủ bị quá tải khi có quá nhiều request gửi đến cùng một lúc.
- Cung cấp dịch vụ và thời gian phản hồi tốt hơn cho tất cả người dùng.
- Bảo vệ hệ thống khỏi các cuộc tấn công Từ chối Dịch vụ (DoS).
Để triển khai giới hạn tốc độ, các hệ thống thường sử dụng 4 thuật toán chính dưới đây:
💧 Thuật toán Leaky Bucket (Xô bị rò rỉ)
- Thuật toán này đưa tất cả các request gửi đến vào một hàng đợi (queue) request theo thứ tự mà chúng được nhận.
- Các request gửi đến có thể ở bất kỳ tốc độ nào, nhưng máy chủ sẽ luôn xử lý các request từ hàng đợi ở một tốc độ cố định.
- Nếu hàng đợi request đã đầy, các request mới đến sẽ bị từ chối.
- Thuật toán này cung cấp cho mỗi người dùng một số lượng token nhất định mà họ có thể sử dụng trong một khoảng thời gian nhất định.
- Khi client tạo ra một request, máy chủ sẽ kiểm tra bucket để đảm bảo rằng nó chứa ít nhất một token.
- Nếu có token, máy chủ sẽ loại bỏ token đó ra khỏi bucket và tiến hành xử lý request.
- Nếu không có sẵn token nào, máy chủ sẽ từ chối request đó.
- Client phải tự tính toán số lượng token mà mình hiện đang có để tránh việc các request bị từ chối.
- Trong thuật toán fixed window counter, một khoảng thời gian cố định sẽ được gán một bộ đếm để đại diện cho số lượng request có thể được xử lý trong giai đoạn đó.
- Khi máy chủ nhận được một request, bộ đếm cho cửa sổ thời gian hiện tại phải bằng không.
- Khi request được xử lý, bộ đếm sẽ bị trừ đi.
- Nếu đạt đến giới hạn cho khoảng thời gian đó, tất cả các request tiếp theo diễn ra trong cửa sổ thời gian đó sẽ bị từ chối.
- Thuật toán này cho phép một số lượng request cố định được thực hiện trong một khoảng thời gian đã được thiết lập sẵn.
- Khi một request mới được tạo, máy chủ sẽ đếm xem đã có bao nhiêu request được thực hiện từ đầu cửa sổ thời gian cho đến thời điểm hiện tại để xác định xem request đó nên được xử lý hay bị từ chối.
- Client cần đảm bảo rằng giới hạn tốc độ không bị vượt quá tại thời điểm tạo request.
Khi làm việc với các API có giới hạn tốc độ, bạn có thể theo dõi các thông tin này thông qua response header. Nhiều API giới hạn tốc độ thêm các chi tiết về rate limit ngay trong header của phản hồi. Các khóa (keys) thường được sử dụng bao gồm:
- X-Rate Limit-Limit: Số lượng request tối đa có thể được thực hiện trong một đơn vị thời gian được chỉ định.
- X-Rate Limit-Remaining: Số lượng request đang chờ xử lý mà người yêu cầu có thể thực hiện trong cửa sổ rate limit hiện tại.
- X-Rate Limit-Reset: Thời điểm mà cửa sổ rate limit sẽ được thiết lập lại (reset).