Trong bối cảnh các hệ thống web ngày càng phải xử lý lưu lượng truy cập lớn và phức tạp, kiểm soát tần suất request trở thành yếu tố sống còn để đảm bảo hiệu năng và tính ổn định. Nếu không có cơ chế kiểm soát phù hợp, chỉ một lượng nhỏ traffic bất thường cũng có thể khiến toàn bộ hệ thống bị quá tải hoặc gián đoạn.
Đó là lý do rate limiting trở thành một trong những kỹ thuật nền tảng trong thiết kế hệ thống hiện đại. Không chỉ giúp bảo vệ server, rate limit còn đóng vai trò quan trọng trong việc ngăn chặn lạm dụng tài nguyên, tăng cường bảo mật và đảm bảo công bằng giữa các người dùng. Bài viết này sẽ giúp bạn hiểu rõ rate limit là gì, cách hoạt động, các thuật toán phổ biến, vị trí triển khai trong kiến trúc web cũng như cách áp dụng hiệu quả.

- Rate limit là gì?
- Vai trò của rate limit trong hệ thống website
- Cơ chế hoạt động của rate limit
- Các thuật toán rate limiting phổ biến
- 4 loại rate limit thường gặp hiện nay
- Rate limit được triển khai ở đâu trong kiến trúc web?
- Rate limiting trong API và web
- Hướng dẫn triển khai rate limit hiệu quả
- Các công cụ hỗ trợ triển khai rate limit phổ biến
- So sánh rate limit với các kỹ thuật liên quan
- Các trường hợp nên sử dụng rate limiting
- Một số hạn chế của rate limited bạn cần lưu ý
Rate limit là gì?
Rate limit (giới hạn tốc độ) là cơ chế kiểm soát tần suất mà một client, có thể là người dùng, địa chỉ IP, tài khoản hoặc thiết bị, được phép gửi yêu cầu (request) đến một hệ thống trong một khoảng thời gian xác định. Hiểu một cách đơn giản, đây là “ngưỡng chịu tải” do hệ thống thiết lập nhằm giới hạn số lượng request hợp lệ, trước khi tiến hành từ chối hoặc làm chậm các yêu cầu vượt quá giới hạn cho phép.
Rate limiting không phải là một cơ chế bảo mật thuần túy như tường lửa, mà là một chính sách quản lý và phân bổ tài nguyên hệ thống. Ví dụ, một người dùng bình thường có thể gửi 10 request mỗi phút, đây được xem là hành vi hợp lệ. Tuy nhiên, nếu một script tự động gửi 10.000 request trong cùng khoảng thời gian, hệ thống cần có cơ chế để phát hiện và phân biệt hành vi bất thường này, từ đó áp dụng giới hạn phù hợp.
Trong thực tế triển khai, rate limiting có thể được áp dụng ở nhiều tầng khác nhau, bao gồm:
- Tầng hạ tầng (infrastructure) như Nginx hoặc load balancer.
- Tầng ứng dụng (application layer) thông qua middleware hoặc API gateway.
- Tầng dịch vụ (service layer), áp dụng riêng cho từng API endpoint.
Mỗi tầng có chức năng bảo vệ một loại tài nguyên khác nhau và phục vụ mục tiêu kiểm soát lưu lượng truy cập theo từng ngữ cảnh cụ thể. Khi một request vượt quá giới hạn, hệ thống thường trả về mã trạng thái HTTP 429 Too Many Requests, thông báo rằng client đã bị giới hạn tần suất truy cập.

Vai trò của rate limit trong hệ thống website
Rate limiting không phải là một tính năng tùy chọn mà là một thành phần nền tảng trong kiến trúc của bất kỳ hệ thống web nào hướng đến sự ổn định và khả năng mở rộng lâu dài.
1. Bảo vệ server khỏi quá tải
Mọi hệ thống server đều có giới hạn tài nguyên vật lý như CPU, RAM, băng thông và số lượng kết nối đồng thời. Khi lưu lượng truy cập vượt quá ngưỡng này, hệ thống không suy giảm dần dần mà có thể rơi vào trạng thái sụp đổ đột ngột.
Rate limiting đóng vai trò như một cơ chế điều tiết lưu lượng đầu vào, đảm bảo hệ thống luôn vận hành trong ngưỡng an toàn có thể xử lý. Trong kiến trúc microservices, vai trò này càng quan trọng hơn. Một service bị quá tải có thể kéo theo các service phụ thuộc bị ảnh hưởng. Áp dụng rate limit tại các ranh giới API (API boundary) giúp ngăn chặn hiệu ứng lan truyền lỗi giữa các dịch vụ.
2. Ngăn chặn spam và bot
Một tỷ lệ lớn lưu lượng internet hiện nay đến từ bot, bao gồm cả bot hợp lệ (crawler, monitoring) và bot độc hại như scraper dữ liệu, tool brute-force hoặc spam đăng ký tài khoản. Rate limiting tạo ra “ma sát” đối với các hành vi tự động này. Người dùng thực thường có hành vi tương tác tự nhiên và chậm hơn, trong khi bot có xu hướng gửi request với tần suất cao và liên tục.
Bằng cách giới hạn tốc độ, hệ thống buộc các hành vi tự động phải chậm lại hoặc bị chặn, từ đó làm giảm đáng kể hiệu quả của các hình thức tấn công tự động. Có thể xem đây là kỹ thuật “phân tách theo thời gian”: thay vì chặn hoàn toàn, hệ thống chỉ điều chỉnh tốc độ, khiến các hành vi bất thường trở nên kém hiệu quả về mặt thời gian và tài nguyên.

3. Tăng tính bảo mật hệ thống
Rate limiting là một lớp phòng thủ hiệu quả trước nhiều dạng tấn công dựa trên tần suất cao, bao gồm brute-force login, dò OTP hoặc khai thác chức năng reset mật khẩu. Bằng cách giới hạn số lượng request trong một khoảng thời gian, hệ thống làm giảm đáng kể khả năng thử liên tục của kẻ tấn công, vô hiệu hóa phần lớn các vector tấn công dạng tự động.
Ngoài ra, rate limiting còn giúp phát hiện hành vi dò quét hệ thống (reconnaissance). Các hoạt động như quét API endpoint, thử user enumeration hoặc khám phá cấu trúc hệ thống thường tạo ra lưu lượng bất thường, từ đó có thể được phát hiện sớm thông qua cơ chế giới hạn tần suất.
4. Đảm bảo công bằng cho người dùng
Trong hệ thống không có rate limiting, tài nguyên thường bị chiếm dụng không cân bằng bởi các client có khả năng gửi request với tần suất cao, đặc biệt là các script tự động. Điều này làm giảm chất lượng trải nghiệm của người dùng thông thường.
Rate limiting giúp thiết lập cơ chế phân bổ tài nguyên công bằng hơn, đảm bảo mỗi client chỉ sử dụng một lượng tài nguyên trong giới hạn cho phép, bất kể khả năng kỹ thuật của họ. Trong các mô hình SaaS, rate limiting còn được sử dụng như một công cụ phân tầng dịch vụ: người dùng miễn phí sẽ có giới hạn thấp hơn, trong khi người dùng trả phí được cấp hạn mức cao hơn. Đây là sự kết hợp giữa yếu tố kỹ thuật và mô hình kinh doanh.
5. Kiểm soát tài nguyên hệ thống
Rate limiting không chỉ phục vụ mục tiêu kỹ thuật mà còn hỗ trợ kiểm soát chi phí vận hành hệ thống. Khi giới hạn được xác định rõ ràng cho mỗi user hoặc mỗi API call, đội ngũ kỹ thuật có thể dự đoán chính xác mức tiêu thụ tài nguyên và lập kế hoạch mở rộng hệ thống một cách chủ động thay vì phản ứng khi xảy ra sự cố.
Đối với các hệ thống tích hợp dịch vụ bên thứ ba (ví dụ: thanh toán, SMS, email API), mỗi request đều có chi phí thực tế. Trong trường hợp này, rate limiting còn đóng vai trò như một cơ chế kiểm soát ngân sách, ngăn chặn các lỗi logic hoặc vòng lặp vô hạn gây ra việc gọi API quá mức và phát sinh chi phí không kiểm soát.

Cơ chế hoạt động của rate limit
Rate limiting hoạt động dựa trên việc theo dõi và kiểm soát số lượng request mà một client có thể gửi trong một khoảng thời gian xác định. Để làm được điều này, hệ thống thường triển khai một cơ chế “đếm và so sánh” dựa trên các quy tắc (rules) đã được cấu hình trước.
Bước 1. Xác định danh tính client
Trước tiên, hệ thống cần xác định “ai” đang gửi request để giúp hệ thống áp dụng giới hạn phù hợp cho từng đối tượng cụ thể thay vì xử lý chung toàn bộ traffic. Client có thể được nhận diện thông qua:
- IP address.
- User ID (khi đã đăng nhập).
- API key.
- Device fingerprint hoặc token.
Bước 2. Thiết lập ngưỡng giới hạn (threshold)
Mỗi client sẽ có một giới hạn cụ thể, ví dụ:
- 100 requests/ phút.
- 1000 requests/ giờ.
- 10 requests/ giây.
Đây là “quota” mà hệ thống cho phép trong một khoảng thời gian nhất định.
Bước 3. Theo dõi và đếm request
Khi một request được gửi đến, hệ thống sẽ:
- Kiểm tra client tương ứng.
- Đọc trạng thái hiện tại (số request đã gửi trong cửa sổ thời gian).
- Tăng bộ đếm lên 1 đơn vị.
Việc này thường được thực hiện thông qua các cấu trúc lưu trữ như Redis, in-memory cache hoặc database tốc độ cao. Mục đích là đảm bảo thao tác cập nhật diễn ra gần như tức thời để không tạo độ trễ trong quá trình xử lý request. Đồng thời, hệ thống phải đảm bảo tính chính xác khi nhiều request xảy ra đồng thời, tránh tình trạng ghi đè hoặc sai lệch số liệu. Trong các hệ thống phân tán, thao tác này thường được thiết kế theo dạng atomic operation để đảm bảo tính nhất quán của dữ liệu.
Bước 4. So sánh với giới hạn
Sau khi cập nhật bộ đếm, hệ thống sẽ so sánh:
- Nếu chưa vượt ngưỡng → Request được xử lý bình thường.
- Nếu vượt ngưỡng → Request bị từ chối hoặc trì hoãn.
Khi bị từ chối, hệ thống thường trả về HTTP status code: 429 Too Many Requests
Bước 5. Reset hoặc làm mới cửa sổ thời gian
Rate limited không phải là giới hạn cố định vĩnh viễn, mà hoạt động theo “cửa sổ thời gian” (time window). Có nhiều cách triển khai phổ biến:
- Fixed window dùng reset sau mỗi khoảng thời gian cố định (ví dụ mỗi phút).
- Sliding window để tính toán linh hoạt theo thời gian trượt.
- Token bucket/ Leaky bucket là mô hình cấp phát token để kiểm soát lưu lượng mượt hơn.
Sau khi cửa sổ kết thúc hoặc điều kiện reset được kích hoạt, bộ đếm sẽ được làm mới.
Bước 6. Xử lý khi vượt giới hạn
Khi client vượt quá rate limited, hệ thống có thể:
- Từ chối request (HTTP 429).
- Trả về thông báo retry-after.
- Tạm thời khóa client.
- Giảm ưu tiên xử lý request (throttling).
Khi đó, cách xử lý tùy thuộc vào mức độ nghiêm trọng và thiết kế hệ thống.

Các thuật toán rate limiting phổ biến
Xác định cần áp dụng rate limit chỉ là bước khởi đầu. Điều quan trọng chính là lựa chọn thuật toán phù hợp với đặc thù hệ thống. Mỗi thuật toán đều có mô hình hoạt động riêng, cùng với những ưu điểm và hạn chế nhất định. Hiểu rõ bản chất từng thuật toán giúp hệ thống được thiết kế đúng ngay từ đầu, thay vì áp dụng máy móc.
1. Fixed Window
Fixed Window là thuật toán rate limiting đơn giản và dễ triển khai nhất. Cơ chế hoạt động dựa trên việc chia thời gian thành các khoảng cố định (fixed intervals), ví dụ mỗi 1 phút hoặc 1 giờ. Trong mỗi khoảng thời gian, hệ thống sẽ đếm số lượng request phát sinh từ một client và so sánh với ngưỡng đã thiết lập. Khi số lượng request đạt đến giới hạn, mọi request tiếp theo trong cùng cửa sổ thời gian sẽ bị từ chối cho đến khi bước sang cửa sổ mới.
Về mặt triển khai, Fixed Window có chi phí rất thấp. Hệ thống chỉ cần lưu một bộ đếm (counter) theo từng client, thường được lưu trong Redis kèm TTL tương ứng với độ dài cửa sổ thời gian. Mỗi request chỉ cần thực hiện thao tác tăng giá trị counter và so sánh với ngưỡng, không yêu cầu xử lý phức tạp hay lưu trữ lịch sử.
Tuy nhiên, hạn chế lớn nhất của Fixed Window nằm ở hiện tượng “boundary burst”. Do ranh giới giữa hai cửa sổ là cố định, một client có thể gửi số lượng request tối đa ở cuối cửa sổ hiện tại và tiếp tục gửi thêm ngay đầu cửa sổ kế tiếp. Điều này tạo ra các đợt spike ngắn hạn vượt quá ngưỡng thiết kế, làm giảm hiệu quả kiểm soát tải thực tế của hệ thống.
Thuật toán này phù hợp với các use case không yêu cầu độ chính xác cao về phân bố thời gian, chẳng hạn như giới hạn số lần export dữ liệu hoặc gửi email theo giờ/ngày.
2. Sliding Window Log
Sliding Window Log được thiết kế để khắc phục điểm yếu của Fixed Window bằng cách loại bỏ ranh giới thời gian cố định. Thay vì chia thời gian thành các khung cứng, thuật toán này theo dõi timestamp của từng request và luôn tính toán dựa trên một khoảng thời gian trượt (sliding window) tính từ thời điểm hiện tại.
Cụ thể, hệ thống chỉ xem xét các request nằm trong khoảng thời gian [now - window_size, now] để quyết định có cho phép request mới hay không.
Cách triển khai phổ biến là sử dụng cấu trúc sorted set trong Redis để lưu timestamp của từng request theo client. Khi có request mới, hệ thống sẽ:
- Loại bỏ các timestamp đã vượt quá thời gian cửa sổ.
- Đếm số request còn lại trong khoảng thời gian hợp lệ.
- So sánh với ngưỡng cho phép.
- Thêm timestamp mới nếu request được chấp nhận.
Ưu điểm lớn nhất của Sliding Window Log là độ chính xác cao. Do không tồn tại ranh giới cố định, hiện tượng burst tại boundary được loại bỏ hoàn toàn. Điều này khiến thuật toán đặc biệt phù hợp với các endpoint nhạy cảm như đăng nhập, xác thực OTP hoặc các API có yêu cầu bảo mật cao.
Tuy nhiên, nhược điểm của phương pháp này là chi phí lưu trữ và xử lý lớn. Mỗi request đều được ghi nhận dưới dạng một timestamp riêng biệt, dẫn đến lượng dữ liệu tăng tuyến tính theo traffic. Trong hệ thống có lưu lượng lớn, điều này gây áp lực đáng kể lên bộ nhớ và I/O, đặc biệt khi cần thực hiện dọn dẹp và truy vấn liên tục.

3. Sliding Window Counter
Sliding Window Counter là một giải pháp trung gian giữa Fixed Window và Sliding Window Log, được thiết kế nhằm cân bằng giữa hiệu năng và độ chính xác. Thay vì lưu từng request riêng lẻ, thuật toán chỉ duy trì số lượng request theo từng cửa sổ thời gian, bao gồm:
- Counter của cửa sổ hiện tại.
- Counter của cửa sổ trước đó.
Sau đó, hệ thống sử dụng phép nội suy tuyến tính để ước lượng số request thực tế trong cửa sổ trượt.
Cụ thể, tổng số request hiệu dụng được tính dựa trên tỷ lệ thời gian đã trôi qua trong cửa sổ hiện tại, kết hợp với đóng góp từ cửa sổ trước đó.
Phương pháp này dựa trên giả định rằng lưu lượng request được phân bố tương đối đều trong mỗi cửa sổ thời gian. Dù không hoàn toàn chính xác tuyệt đối, sai số trong thực tế thường rất nhỏ và có thể chấp nhận được đối với hầu hết hệ thống production.
Ưu điểm của Sliding Window Counter là:
- Tránh được hiện tượng burst tại ranh giới như Fixed Window.
- Không cần lưu từng request như Sliding Window Log.
- Chi phí lưu trữ và tính toán thấp.
Nhờ đó, thuật toán này thường được sử dụng trong các hệ thống rate limiting quy mô lớn, nơi cần cân bằng giữa hiệu năng, độ chính xác và khả năng mở rộng.
4. Token Bucket
Token Bucket là một trong những thuật toán rate limiting phổ biến nhất trong hệ thống production nhờ khả năng cân bằng tốt giữa kiểm soát lưu lượng và tính linh hoạt. Cơ chế hoạt động dựa trên một “bucket” chứa các token. Token được thêm vào bucket theo một tốc độ cố định (refill rate), ví dụ 10 token mỗi giây và bucket có dung lượng tối đa xác định (capacity).
Mỗi request khi đến sẽ cần “tiêu thụ” một token:
- Nếu bucket còn token → request được chấp nhận
- Nếu bucket rỗng → request bị từ chối hoặc trì hoãn
Điểm mạnh của Token Bucket nằm ở khả năng xử lý burst traffic. Nếu hệ thống không có request trong một khoảng thời gian, token sẽ được tích lũy lại trong bucket. Khi có đột biến traffic, client có thể sử dụng lượng token đã tích lũy này để gửi nhiều request liên tiếp trong thời gian ngắn mà vẫn hợp lệ.
Điều này tạo ra sự linh hoạt mà Fixed Window hoặc Sliding Window khó đạt được vừa kiểm soát được tốc độ trung bình, vừa cho phép những đợt tăng đột biến ngắn hạn không gây ảnh hưởng nghiêm trọng đến hệ thống.
Token Bucket đặc biệt phù hợp với:
- API public cần trải nghiệm mượt.
- Hệ thống có traffic không đều (bursty traffic).
- Streaming hoặc real-time service.
5. Leaky Bucket
Leaky Bucket và Token Bucket thường bị nhầm lẫn do cùng dựa trên một hình ảnh ẩn dụ “bucket” nhưng hai thuật toán này lại khác biệt rõ rệt. Nếu Token Bucket tập trung kiểm soát lượng request được chấp nhận (input rate) thì Leaky Bucket kiểm soát tốc độ xử lý request (output rate).
Cơ chế hoạt động của Leaky Bucket dựa trên một hàng đợi (queue). Các request khi đến sẽ được đưa vào queue và hệ thống sẽ xử lý chúng với một tốc độ cố định, ví dụ 10 request mỗi giây với tốc độ request đầu vào. Khi queue đạt đến dung lượng tối đa, các request mới sẽ bị từ chối.
Ưu điểm lớn nhất của Leaky Bucket là khả năng tạo ra lưu lượng đầu ra ổn định và dễ dự đoán. Dù traffic đầu vào biến động thế nào, hệ thống downstream vẫn nhận được một dòng request đều đặn. Điều này đặc biệt quan trọng trong các tình huống mà hệ thống phía sau không chịu được burst traffic, chẳng hạn như:
- Payment gateway có giới hạn tần suất gọi API.
- Hệ thống legacy database không tối ưu cho xử lý đồng thời.
- Dịch vụ bên thứ ba có chi phí tính theo số lượng request theo thời gian.
Trong những trường hợp này, Leaky Bucket đóng vai trò như một lớp đệm (buffer), giúp “làm mượt” lưu lượng và bảo vệ hệ thống phía sau khỏi các đột biến.
Tuy nhiên, nhược điểm của thuật toán này cũng xuất phát từ chính cơ chế ổn định đó. Leaky Bucket không tận dụng được các khoảng thời gian hệ thống nhàn rỗi. Ngay cả khi client hợp lệ gửi nhiều request sau một thời gian không hoạt động, các request vẫn phải chờ xử lý tuần tự theo tốc độ cố định. Điều này làm tăng độ trễ và có thể ảnh hưởng đến trải nghiệm người dùng.

4 loại rate limit thường gặp hiện nay
Rate limiting không chỉ khác nhau ở thuật toán mà còn khác nhau ở cách xác định đối tượng áp dụng (scope). Tùy vào mục tiêu kiểm soát là bảo mật, công bằng tài nguyên hay tối ưu hiệu năng, hệ thống có thể triển khai nhiều loại rate limit song song ở các cấp độ khác nhau. Lựa chọn đúng loại rate limit giúp kiểm soát chính xác hành vi truy cập mà không ảnh hưởng tiêu cực đến trải nghiệm người dùng hợp lệ.
1. Rate limit theo IP
Rate limit theo IP là hình thức kiểm soát tần suất truy cập dựa trên địa chỉ IP của client - một trong những cách nhận diện cơ bản và được triển khai sớm nhất trong hầu hết các hệ thống web. Mỗi IP sẽ được gán một ngưỡng request nhất định trong một khoảng thời gian và mọi request phát sinh từ IP đó đều được theo dõi, cộng dồn vào cùng một bộ đếm. Khi vượt quá giới hạn, hệ thống sẽ từ chối hoặc làm chậm các request tiếp theo từ chính IP đó.
Tuy nhiên, rate limit theo IP cũng tồn tại một số hạn chế:
- Nhiều người dùng có thể dùng chung một IP (NAT, mạng công ty), dễ bị giới hạn oan.
- Kẻ tấn công có thể sử dụng proxy hoặc botnet để thay đổi IP liên tục.
Vì vậy, IP-based rate limiting thường được dùng như lớp bảo vệ đầu tiên, kết hợp với các cơ chế khác để tăng hiệu quả.
2. Rate limit theo user, token
Khác với IP-based, rate limit theo user hoặc token dựa trên danh tính đã được xác thực của client, chẳng hạn như user ID, session hoặc API key. Điều này cho phép hệ thống áp dụng chính sách giới hạn chính xác hơn cho từng người dùng cụ thể, với môi trường mạng hoặc thiết bị mà họ sử dụng. Mỗi user/token sẽ có một quota riêng biệt, giúp kiểm soát hành vi truy cập ở mức cá nhân hóa cao hơn. Ngoài ra, đây cũng là nền tảng để triển khai các chính sách kinh doanh, ví dụ: tăng quota cho người dùng trả phí.
3. Rate limit theo API endpoint
Trong thực tế, không phải tất cả API endpoint đều có mức độ quan trọng hoặc chi phí xử lý như nhau. Rate limit theo endpoint cho phép hệ thống áp dụng các giới hạn khác nhau cho từng route cụ thể, dựa trên mức độ tiêu tốn tài nguyên hoặc độ nhạy cảm của chức năng đó. Mỗi endpoint sẽ có một chính sách rate limit riêng, thay vì chia sẻ chung một quota toàn hệ thống.
Rate limit API theo endpoint cho phép:
- Áp dụng giới hạn riêng cho từng API.
- Bảo vệ các endpoint “nặng” (ví dụ: export dữ liệu, search phức tạp).
- Siết chặt các endpoint nhạy cảm (login, reset password).
Ví dụ:
- /login → 5 request/phút.
- /search → 100 request/phút.
- /export → 10 request/giờ.
4. Rate limit theo hệ thống (global)
Rate limit toàn hệ thống (global rate limit) là cơ chế kiểm soát tổng lưu lượng request đi vào một hệ thống hoặc một service cụ thể, không phân biệt nguồn gốc request. Thay vì tập trung vào từng client riêng lẻ, cơ chế này đặt ra một ngưỡng tổng thể nhằm đảm bảo toàn bộ hệ thống không vượt quá khả năng xử lý tại bất kỳ thời điểm nào.
Khi đạt ngưỡng global limit, hệ thống có thể:
- Từ chối request mới
- Giảm ưu tiên (throttling)
- Áp dụng cơ chế queue hoặc circuit breaker
Global rate limiting thường được triển khai ở tầng infrastructure như load balancer hoặc API gateway, đóng vai trò là “hàng rào cuối cùng” bảo vệ toàn hệ thống.

Rate limit được triển khai ở đâu trong kiến trúc web?
Rate limiting không phải là một cơ chế đặt tại một điểm duy nhất mà thường được triển khai theo mô hình đa tầng (multi-layered) trong toàn bộ kiến trúc hệ thống. Mỗi tầng đảm nhận một vai trò khác nhau từ giảm tải sớm, kiểm soát truy cập đến bảo vệ tài nguyên nội bộ. Phân bổ hợp lý các lớp rate limit giúp hệ thống vừa tối ưu hiệu năng, vừa đảm bảo tính ổn định và bảo mật.
1. Client-side
Rate limiting ở phía client là lớp kiểm soát “mềm”, được triển khai ngay trên ứng dụng frontend (web, mobile app) trước khi request được gửi đến server. Mục tiêu chính khi triển khai rate limiting ở phía client là giảm thiểu các request không cần thiết trước khi được gửi đến server, hạn chế lãng phí tài nguyên hệ thống.
Cách triển khai phổ biến:
- Giới hạn số lần người dùng có thể thực hiện một hành động trong thời gian ngắn (ví dụ: disable button sau khi click).
- Thêm debounce hoặc throttle khi gọi API (ví dụ: search input).
- Hiển thị cảnh báo khi người dùng thao tác quá nhanh.
Ví dụ:
- Sau khi bấm “Gửi OTP”, nút bị khóa trong 60 giây.
- Input search chỉ gọi API sau 300ms không nhập thêm.
2. API Gateway
API Gateway là lớp triển khai rate limiting quan trọng nhất trong kiến trúc hiện đại, vì đây là “cửa ngõ” tiếp nhận toàn bộ request trước khi đi vào hệ thống backend. Tại đây, mọi request đều được kiểm tra và đánh giá dựa trên các chính sách rate limit đã được cấu hình sẵn, giúp chặn sớm các request vượt ngưỡng trước khi chúng tiêu tốn tài nguyên của các service phía sau.
Mục tiêu chính của rate limiting API là kiểm soát lưu lượng truy cập tổng thể, đảm bảo hệ thống backend luôn hoạt động trong ngưỡng an toàn, đồng thời ngăn chặn các hành vi lạm dụng API từ bên ngoài.
Cách triển khai phổ biến:
- Xác định client dựa trên IP, API key hoặc user token.
- Lưu trạng thái request trong hệ thống lưu trữ nhanh (thường là Redis).
- Kiểm tra và so sánh với ngưỡng giới hạn trước khi forward request.
- Trả về HTTP 429 nếu vượt quá rate limit.
Ví dụ:
- Mỗi API key chỉ được phép gửi 100 request/phút.
- Endpoint /login bị giới hạn 5 request/phút/IP.
- Giới hạn tổng 1000 request/giây cho toàn hệ thống.
Ưu điểm:
- Chặn request sớm, giảm tải đáng kể cho backend.
- Quản lý tập trung, dễ cấu hình và mở rộng.
- Áp dụng đồng nhất cho toàn bộ hệ thống.
3. Application Level
Rate limiting ở tầng ứng dụng (Application Level) được triển khai trực tiếp trong logic của backend service, thường thông qua middleware hoặc các lớp xử lý riêng cho từng chức năng cụ thể. Khác với API Gateway áp dụng các quy tắc chung, tầng application cho phép kiểm soát chi tiết hơn dựa trên ngữ cảnh nghiệp vụ (business logic) và trạng thái thực tế của người dùng.
Một số cách triển khai phổ biến:
- Sử dụng middleware để kiểm tra rate limit trước khi xử lý request.
- Áp dụng giới hạn riêng cho từng chức năng (login, OTP, payment…).
- Kết hợp với Redis hoặc database để lưu trạng thái và đếm request.
- Tùy chỉnh rule theo user role, trạng thái tài khoản hoặc hành vi trước đó.
Ví dụ:
- Giới hạn 5 lần đăng nhập sai trong 10 phút cho mỗi user.
- Giới hạn gửi OTP tối đa 3 lần/phút cho một số điện thoại.
- Giới hạn export dữ liệu theo ngày đối với user free.

Rate limiting trong API và web
Rate limiting được áp dụng linh hoạt trong nhiều ngữ cảnh cụ thể của hệ thống web và API. Triển khai đúng ngữ cảnh giúp hệ thống vừa đảm bảo hiệu năng, vừa duy trì trải nghiệm người dùng ổn định.
1. Rate limit trong REST API
Trong các hệ thống REST API, rate limiting gần như là thành phần bắt buộc để kiểm soát cách client tương tác với dịch vụ. Mỗi API thường được gán một giới hạn cụ thể dựa trên API key, user hoặc IP nhằm đảm bảo không có client nào tiêu thụ tài nguyên vượt mức cho phép.
Cách triển khai phổ biến là áp dụng giới hạn theo từng endpoint hoặc theo nhóm API, kết hợp với các thuật toán như Token Bucket hoặc Sliding Window. Khi vượt quá giới hạn, API sẽ trả về mã lỗi 429 kèm thông tin về thời gian có thể retry. Áp dụng rate limit trong REST API không chỉ giúp bảo vệ hệ thống khỏi quá tải mà còn đóng vai trò quan trọng trong việc phân tầng dịch vụ (free vs premium), kiểm soát usage và đảm bảo tính công bằng giữa các client.
2. Rate limit trong hệ thống login
Hệ thống đăng nhập là một trong những điểm nhạy cảm nhất của bất kỳ ứng dụng nào, do đó rate limiting tại đây thường được thiết kế chặt chẽ hơn so với các endpoint thông thường.
Thông thường, hệ thống sẽ giới hạn số lần đăng nhập trong một khoảng thời gian nhất định, dựa trên IP, user hoặc kết hợp cả hai. Ngoài ra, có thể áp dụng thêm các cơ chế như delay tăng dần sau mỗi lần đăng nhập thất bại hoặc tạm khóa tài khoản khi vượt ngưỡng.
Mục tiêu chính là ngăn chặn các hành vi đăng nhập bất thường mà vẫn đảm bảo người dùng hợp lệ không bị ảnh hưởng quá nhiều. Đây là một ví dụ điển hình của việc kết hợp rate limiting với logic bảo mật.

3. Rate limit chống brute force
Brute force là hình thức tấn công dựa trên việc thử hàng loạt tổ hợp thông tin (mật khẩu, mã OTP…) trong thời gian ngắn. Rate limiting là một trong những biện pháp hiệu quả nhất để làm giảm hoặc vô hiệu hóa kiểu tấn công này.
Cách triển khai thường bao gồm giới hạn số lần thử trong một khoảng thời gian ngắn, ví dụ 5 - 10 lần/phút cho mỗi tài khoản hoặc IP. Khi vượt quá giới hạn, hệ thống có thể tạm thời chặn request, yêu cầu xác minh bổ sung (CAPTCHA) hoặc khóa chức năng trong một khoảng thời gian.
Bằng cách giới hạn tốc độ thử, rate limiting làm cho brute force trở nên không khả thi về mặt thời gian và tài nguyên, từ đó tăng đáng kể độ an toàn cho hệ thống.
4. Rate limit trong dịch vụ cloud
Trong môi trường cloud, rate limiting không chỉ phục vụ mục tiêu kỹ thuật mà còn liên quan trực tiếp đến quản lý tài nguyên và chi phí vận hành. Các dịch vụ cloud thường áp dụng rate limited để kiểm soát mức sử dụng của từng khách hàng, tránh tình trạng một user tiêu thụ quá nhiều tài nguyên ảnh hưởng đến hệ thống chung.
Ví dụ, các nền tảng API hoặc dịch vụ serverless thường giới hạn số request mỗi giây, số lần gọi API hoặc số lượng job được xử lý trong một khoảng thời gian. Khi vượt quá giới hạn, request có thể bị từ chối hoặc đưa vào hàng đợi. Ngoài ra, rate limiting trong cloud còn giúp dự đoán và kiểm soát chi phí tốt hơn, tránh các tình huống phát sinh chi phí đột biến do lỗi hệ thống hoặc bị lạm dụng tài nguyên.

Hướng dẫn triển khai rate limit hiệu quả
Triển khai rate limiting là quá trình thiết kế cân bằng giữa bảo vệ hệ thống và duy trì trải nghiệm người dùng. Một cấu hình không hợp lý có thể gây tác dụng ngược: hoặc quá lỏng lẻo khiến hệ thống dễ bị quá tải hoặc quá chặt khiến người dùng hợp lệ bị ảnh hưởng. Dưới đây là các bước triển khai rate limit một cách hiệu quả và thực tế.
1. Xác định ngưỡng hợp lý
Xác định ngưỡng rate limit cần dựa trên năng lực thực tế của hệ thống và hành vi sử dụng của người dùng. Không nên áp dụng một con số cố định theo cảm tính mà cần dựa trên dữ liệu như số request trung bình, peak traffic và khả năng xử lý của backend.
Thông thường, ngưỡng sẽ được thiết lập theo từng cấp độ:
- Request/giây.
- Request/phút.
- Request/giờ.
Ngoài ra, nên có sự khác biệt giữa các endpoint ví dụ API nặng như export dữ liệu sẽ có giới hạn thấp hơn so với API nhẹ như lấy thông tin cơ bản.
2. Phân loại user
Không phải tất cả người dùng đều nên có cùng một mức giới hạn. Việc phân loại user giúp hệ thống áp dụng chính sách rate limit phù hợp hơn với từng nhóm đối tượng.
Ví dụ:
- User chưa đăng nhập, giới hạn thấp hơn.
- User đã xác thực, giới hạn cao hơn.
- User trả phí, quota lớn hơn user miễn phí.
Cách tiếp cận này không chỉ giúp tối ưu tài nguyên mà còn hỗ trợ mô hình kinh doanh (SaaS), nơi rate limit trở thành một phần của chiến lược phân tầng dịch vụ.
3. Kết hợp caching (Redis)
Để rate limiting hoạt động hiệu quả trong môi trường có lưu lượng cao, việc sử dụng hệ thống lưu trữ tốc độ cao là bắt buộc. Redis là lựa chọn phổ biến nhờ khả năng xử lý nhanh và hỗ trợ các thao tác atomic như tăng counter.
Khi triển khai, mỗi client (IP, user, API key) sẽ được gán một key riêng trong Redis, kèm theo counter và TTL tương ứng với cửa sổ thời gian. Điều này giúp việc kiểm tra và cập nhật trạng thái diễn ra gần như tức thời mà không gây bottleneck cho hệ thống. Ngoài ra, Redis còn hỗ trợ các cấu trúc dữ liệu như sorted set hoặc token bucket pattern, phù hợp với nhiều thuật toán rate limiting khác nhau.

4. Log và monitor thường xuyên
Rate limiting không phải là cấu hình “set-and-forget”. Hệ thống cần được theo dõi liên tục để đảm bảo các ngưỡng giới hạn vẫn phù hợp với thực tế.
Việc log lại các request bị rate limit giúp:
- Phát hiện hành vi bất thường hoặc tấn công.
- Xác định ngưỡng có đang quá chặt hoặc quá lỏng.
- Phân tích pattern sử dụng của người dùng.
Kết hợp với các công cụ monitoring (dashboard, alert), đội ngũ kỹ thuật có thể phản ứng kịp thời khi có spike traffic hoặc sự cố liên quan đến rate limit.
5. Trả về thông báo rõ ràng cho user
Khi một request bị từ chối do vượt rate limit, cách hệ thống phản hồi có ảnh hưởng trực tiếp đến trải nghiệm người dùng. Thay vì chỉ trả về lỗi chung chung nên cung cấp thông tin rõ ràng để user hiểu và xử lý.
Thông thường, response nên bao gồm:
- HTTP status code 429 Too Many Requests.
- Thông tin về thời gian có thể thử lại (Retry-After).
- Thông điệp giải thích ngắn gọn.

Các công cụ hỗ trợ triển khai rate limit phổ biến
Triển khai rate limiting hiếm khi được xây dựng hoàn toàn từ đầu, mà thường dựa trên các công cụ và giải pháp đã được tối ưu sẵn. Tùy vào kiến trúc hệ thống và vị trí áp dụng (infrastructure, gateway hay application), đội ngũ kỹ thuật có thể lựa chọn công cụ phù hợp để triển khai rate limit một cách hiệu quả và linh hoạt.
- Redis: Redis là công cụ phổ biến nhất khi triển khai rate limiting ở tầng backend hoặc API gateway, nhờ khả năng xử lý dữ liệu trong bộ nhớ với độ trễ cực thấp. Redis thường được sử dụng để lưu trữ trạng thái của rate limit, bao gồm số lượng request, timestamp hoặc token. Với các thao tác atomic như INCR, EXPIRE hoặc các cấu trúc dữ liệu như sorted set, Redis cho phép triển khai nhiều thuật toán rate limiting khác nhau như Fixed Window, Sliding Window hay Token Bucket một cách hiệu quả.
- NGINX: NGINX là một trong những công cụ phổ biến để triển khai rate limiting ở tầng hạ tầng (infrastructure level), đặc biệt trong vai trò reverse proxy hoặc load balancer. NGINX cung cấp module limit_req cho phép giới hạn số lượng request theo IP hoặc key xác định. Cơ chế hoạt động thường dựa trên thuật toán leaky bucket, giúp kiểm soát tốc độ request một cách ổn định và ngăn chặn các đợt burst traffic.
- Libraries: Ngoài các công cụ hạ tầng, nhiều thư viện (libraries) trong các ngôn ngữ lập trình cũng hỗ trợ triển khai rate limiting trực tiếp trong application. Các thư viện phổ biến bao gồm Node.js, Python, Java thường cung cấp sẵn các thuật toán rate limiting phổ biến và tích hợp dễ dàng vào middleware của ứng dụng. Chúng cho phép developer cấu hình linh hoạt theo từng endpoint, user hoặc logic nghiệp vụ cụ thể.

So sánh rate limit với các kỹ thuật liên quan
Rate limit, throttling và quota thường được sử dụng thay thế cho nhau, nhưng đại diện cho các cách tiếp cận khác nhau trong việc kiểm soát tài nguyên và lưu lượng truy cập. Hiểu rõ sự khác biệt giúp thiết kế hệ thống chính xác hơn, tránh áp dụng sai cơ chế dẫn đến trải nghiệm người dùng kém hoặc lãng phí tài nguyên.
| Tiêu chí | Rate Limit | Throttling | Quota |
| Khái niệm | Giới hạn số lượng request trong một khoảng thời gian. | Làm chậm tốc độ xử lý request khi vượt ngưỡng. | Giới hạn tổng số request trong một khoảng thời gian dài. |
| Cách hoạt động | Đếm request và từ chối khi vượt ngưỡng. | Không từ chối ngay, mà giảm tốc độ xử lý. | Theo dõi tổng usage và chặn khi dùng hết quota. |
| Phản hồi khi vượt giới hạn | Trả về lỗi (thường là 429). | Delay, queue hoặc xử lý chậm lại. | Từ chối request cho đến khi quota được reset. |
| Mục tiêu chính | Bảo vệ hệ thống khỏi quá tải ngắn hạn. | Làm mượt lưu lượng, tránh spike. | Kiểm soát mức sử dụng tài nguyên dài hạn. |
| Thời gian áp dụng | Ngắn hạn (giây, phút). | Thời gian thực (real-time control). | Dài hạn (giờ, ngày, tháng). |
| Ví dụ thực tế | 100 request/phút. | Xử lý tối đa 10 request/giây, phần còn lại chờ. | 10.000 request/tháng cho user free. |
| Tính linh hoạt | Trung bình. | Cao (có thể điều chỉnh động). | Thấp (thường cố định theo plan). |
| Use case phổ biến | API public, login, bảo mật. | Streaming, queue, bảo vệ downstream. | SaaS, API billing, phân tầng dịch vụ. |
Các trường hợp nên sử dụng rate limiting
Rate limiting không phải lúc nào cũng cần áp dụng cho mọi thành phần trong hệ thống, nhưng có những tình huống mà việc triển khai là gần như bắt buộc. Dưới đây là những trường hợp cụ thể:
- Khi hệ thống có nguy cơ bị quá tải do traffic tăng đột biến (traffic spike).
- Khi cần bảo vệ API public khỏi việc bị lạm dụng hoặc gọi quá mức.
- Khi triển khai các chức năng nhạy cảm như login, OTP, reset mật khẩu.
- Khi cần ngăn chặn tấn công brute force hoặc credential stuffing.
- Khi hệ thống có các endpoint tiêu tốn nhiều tài nguyên (ví dụ: export dữ liệu, search phức tạp).
- Khi muốn đảm bảo công bằng tài nguyên giữa các user.
- Khi xây dựng mô hình SaaS với nhiều gói dịch vụ (free vs premium).
- Khi tích hợp với dịch vụ bên thứ ba có giới hạn hoặc chi phí theo số lượng request.
- Khi cần kiểm soát chi phí vận hành hệ thống.
- Khi hệ thống có kiến trúc microservices và cần ngăn chặn lan truyền lỗi (cascading failure).
- Khi muốn giảm tải cho backend bằng cách chặn request ngay từ gateway.

Một số hạn chế của rate limited bạn cần lưu ý
Nếu thiết kế hoặc triển khai không phù hợp, nó có thể gây ra những tác động tiêu cực đến trải nghiệm người dùng hoặc thậm chí làm sai lệch hành vi hệ thống.
- Dễ ảnh hưởng đến người dùng hợp lệ: Nếu ngưỡng giới hạn được thiết lập quá thấp hoặc không phù hợp với hành vi thực tế, người dùng bình thường có thể bị chặn ngoài ý muốn, đặc biệt trong các trường hợp sử dụng chung IP (mạng công ty, quán café).
- Không ngăn chặn hoàn toàn tấn công: Rate limiting chỉ làm giảm tốc độ tấn công, chứ không thể loại bỏ hoàn toàn. Các attacker vẫn có thể vượt qua bằng cách sử dụng nhiều IP (botnet, proxy) hoặc phân tán request theo thời gian.
- Khó xác định ngưỡng tối ưu: Lựa chọn mức giới hạn phù hợp là một bài toán khó, đòi hỏi phân tích dữ liệu thực tế và điều chỉnh liên tục. Ngưỡng quá cao sẽ kém hiệu quả, trong khi quá thấp sẽ gây ảnh hưởng tiêu cực.
- Tăng độ phức tạp hệ thống: Khi triển khai ở nhiều tầng (gateway, application, service), rate limiting có thể làm hệ thống trở nên phức tạp hơn, khó debug và khó đồng bộ nếu không có thiết kế rõ ràng.

Qua bài viết của Phương Nam Vina, có thể thấy rate limiting không chỉ là một kỹ thuật kiểm soát request đơn thuần mà là nền tảng quan trọng giúp hệ thống web vận hành ổn định, an toàn và bền vững trong môi trường lưu lượng ngày càng phức tạp. Từ bảo vệ server khỏi quá tải, ngăn chặn hành vi lạm dụng, cho đến đảm bảo công bằng tài nguyên giữa các người dùng, rate limit đóng vai trò như một “van điều tiết” không thể thiếu trong kiến trúc hiện đại. Tuy nhiên, hiệu quả của rate limiting không nằm ở áp dụng hay không mà nằm ở cách triển khai. Lựa chọn đúng thuật toán, xác định ngưỡng phù hợp, kết hợp đa tầng (client, gateway, application) và theo dõi liên tục là những yếu tố quyết định hệ thống có thực sự được bảo vệ hay không.
Tham khảo thêm:
Session là gì? Phân biệt session và cookie chi tiết
Pentest là gì? Mục đích và quy trình triển khai web pentesting
