Server

429 Too Many Requests — Ai đang giới hạn bạn?

Cập nhật 2026-08-31Đọc ~10 phút

429 Too Many Requests nghĩa là có thứ gì đó đã đếm số yêu cầu của bạn, kết luận là quá nhiều, và ngừng phục vụ. Không có gì hỏng cả — đây là hệ thống hoạt động đúng như thiết kế, và thiết kế đó đang nói thẳng với bạn rằng hãy chậm lại.

Điều phức tạp là ba lớp khác nhau đều có thể tạo ra nó, và nhìn từ bên ngoài chúng giống hệt nhau. Máy chủ web của bạn có thể giới hạn khách truy cập. CDN hoặc WAF như Cloudflare có thể giới hạn họ trước khi yêu cầu tới được bạn. Và API bên ngoài mà code của bạn gọi có thể giới hạn chính máy chủ của bạn. Cùng một mã trạng thái, ba cách xử lý hoàn toàn khác nhau.

Vậy nên bước đầu tiên có ích không phải là sửa gì cả — mà là xác định lớp nào đang đếm.

Ai đang giới hạn?

Xác định nguồn trước khi thay đổi bất cứ thứ gì. Bản thân response thường đã cho biết, nếu bạn nhìn vào header thay vì chỉ nhìn trang hiển thị.

NguồnNhận ra bằng cách nàoSửa ở đâu
CDN / WAF (như Cloudflare)Trang lỗi có thương hiệu, có ray ID, có header cf-Bảng điều khiển CDN — không phải máy chủ
Máy chủ web của bạnTrang lỗi trơn của Nginx/Apache hoặc trang tùy chỉnhCấu hình máy chủ (limit_req, mod_evasive)
Ứng dụng của bạnBody JSON theo định dạng lỗi bạn tự thiết kếCode ứng dụng và quy tắc giới hạn của nó
API phía trênChỉ các lệnh gọi từ máy chủ thất bại; khách truy cập vẫn bình thườngCode client — thêm backoff và cache
💡 Chạy "curl -I" tới URL và đọc header. Cloudflare thêm cf-ray; nhiều API thêm X-RateLimit-Limit, X-RateLimit-Remaining và X-RateLimit-Reset. Ba header đó trả lời câu hỏi "ai và bao nhiêu" chỉ trong một lệnh.

Retry-After: header nói cho bạn biết phải làm gì

Một 429 được viết đúng chuẩn sẽ kèm header Retry-After, và đó là thông tin hữu ích nhất trong toàn bộ response.

Nó có hai dạng: số giây cần chờ, hoặc một mốc thời gian HTTP để chờ tới. Dù dạng nào thì đó cũng là máy chủ nói thẳng khi nào nó sẽ nhận yêu cầu trở lại — tốt hơn nhiều so với tự đoán.

Nếu bạn đang viết client, hãy đọc và tuân theo nó. Thử lại ngay lập tức sau khi nhận 429 chính là hành vi khiến địa chỉ IP bị chặn hẳn thay vì chỉ bị làm chậm, vì nhìn từ phía máy chủ nó không khác gì một cuộc tấn công.

Nếu bạn là bên phát ra 429, hãy gửi kèm nó. Không có Retry-After, client viết tốt buộc phải đoán, còn client viết dở sẽ dội vào bạn liên tục.

Nguyên nhân thường gặp, phổ biến nhất trước

  • Code gọi API trong vòng lặp mà không điều tiết nhịp độ. Duyệt vài nghìn bản ghi rồi gọi API cho từng bản ghi sẽ chạm giới hạn của hầu hết mọi API chỉ trong vài giây.
  • Không cache các lệnh gọi lặp lại. Lấy cùng một tỷ giá hay cùng dữ liệu sản phẩm ở mỗi lượt tải trang nghĩa là nhân số yêu cầu với lượng truy cập.
  • Hệ thống chống bot cảnh báo nhầm với lưu lượng hợp lệ. Cloudflare và các công cụ tương tự đôi khi xếp công cụ giám sát, trình đọc feed hay một crawler chăm chỉ nhưng trung thực vào nhóm lạm dụng.
  • Dùng chung địa chỉ IP. Trên shared hosting hoặc sau NAT của công ty, bạn thừa hưởng cả danh tiếng lẫn số lượng yêu cầu của mọi người dùng chung địa chỉ đó.
  • wp-cron hoặc kiểu polling tương tự trên site đông khách. WordPress kích hoạt cron theo lượt xem trang; site lưu lượng cao có thể tạo ra hàng trăm yêu cầu nội bộ mỗi phút.
  • Vòng lặp thử lại không có backoff. 429 đầu tiên kích hoạt một lần thử lại, lần đó lại nhận 429, lại kích hoạt thử lại — biến một giới hạn ngắn hạn thành một lệnh chặn kéo dài.
  • Endpoint đăng nhập hoặc form bị dò mật khẩu. Ở đây 429 đang làm đúng việc của nó và cách xử lý đúng là để yên.

Nếu code của bạn bị giới hạn: hãy lùi lại đúng cách

Khi bạn ở phía client, hành vi đúng đã có chuẩn mực rõ ràng và đáng để viết cho tử tế một lần.

Dùng exponential backoff kèm jitter. Chờ 1 giây, rồi 2, rồi 4, rồi 8 — và cộng thêm một lượng ngẫu nhiên nhỏ mỗi lần. Phần ngẫu nhiên rất quan trọng: không có nó, mọi client cùng thất bại một lúc sẽ cùng thử lại một lúc, tạo thành một đợt sóng đồng bộ khiến tất cả tiếp tục bị giới hạn.

Tuân theo Retry-After khi có. Nó thắng giá trị bạn tự tính, vì máy chủ biết rõ hơn thuật toán của bạn.

Giới hạn số lần thử lại. Vòng lặp thử lại vô hạn biến giới hạn tạm thời thành lệnh chặn vĩnh viễn, đồng thời che giấu vấn đề thật khỏi tầm mắt bạn.

Cache thật mạnh tay. Yêu cầu rẻ nhất là yêu cầu không bao giờ được gửi. Dữ liệu thay đổi theo giờ không cần lấy lại ở mỗi lượt xem trang, và một lớp cache ngắn thường xóa sạch vấn đề rate limit.

Gộp lô nếu API hỗ trợ. Một yêu cầu lấy một trăm bản ghi tốt hơn một trăm yêu cầu lấy từng bản ghi, vì hầu hết API đếm số yêu cầu chứ không đếm số bản ghi.

💡 Nếu đã làm backoff và cache đầy đủ mà vẫn thường xuyên chạm giới hạn, câu trả lời trung thực thường là bạn cần gói API cao hơn — không phải một mẹo lách khéo hơn. Cố lách rate limit bằng cách xoay vòng IP nhiều khả năng vi phạm điều khoản của nhà cung cấp và dẫn tới khóa tài khoản.

Nếu khách truy cập của bạn nhận 429

  • Xác định là máy chủ hay CDN. Trang lỗi cho biết: trang có thương hiệu kèm ray ID là CDN, trang trơn là máy chủ.
  • Xem lại mẫu yêu cầu thật trong access log trước khi nới lỏng bất cứ điều gì. Nếu lưu lượng đó thực sự bất thường, giới hạn đang hoạt động đúng và nên giữ nguyên.
  • Tìm các cảnh báo nhầm với bot tốt. Googlebot, công cụ giám sát uptime và trình đọc feed hợp lệ có thể vướng vào quy tắc quá gắt — và giới hạn Googlebot sẽ khiến bạn mất thứ hạng.
  • Kiểm tra xem chính website của bạn có tạo ra tải đó không. Plugin polling endpoint nội bộ, hay cron cấu hình sai, có thể ăn hết hạn mức trước khi khách thật kịp tới.
  • Bật cache trang trước khi nâng giới hạn. Trang đã cache thậm chí không chạm tới bộ đếm, tức là xử lý nguyên nhân chứ không phải triệu chứng.
  • Đặt giới hạn theo từng endpoint thay vì đặt chung. Endpoint đăng nhập và API xứng đáng bị siết chặt; trang nội dung tĩnh thường không cần giới hạn gì cả.

Vì sao nâng giới hạn thường là bước sai đầu tiên

Bản năng khi thấy 429 là đi nâng ngưỡng. Đôi khi điều đó đúng, nhưng thường xuyên hơn nó biến một vấn đề thành một vấn đề tệ hơn.

Rate limit tồn tại để bảo vệ năng lực hữu hạn. Nâng ngưỡng mà không tăng năng lực nghĩa là những yêu cầu đó giờ sẽ chạm tới ứng dụng, ăn worker và bộ nhớ, và bạn đổi một mã 429 gọn gàng lấy một website chậm hoặc một mã 503 — trải nghiệm tệ hơn với chi phí cao hơn.

Trình tự tốt hơn là: cache trước, để phần lớn yêu cầu không bao giờ chạm bộ đếm; sửa những thứ tạo ra tải không cần thiết; rồi nếu nhu cầu thật vẫn vượt giới hạn, hãy nâng nó lên kèm theo năng lực đủ để phục vụ.

Ngoại lệ là giới hạn vốn được đặt quá thấp so với lưu lượng bình thường ngay từ đầu. Nếu access log cho thấy khách bình thường duyệt web bình thường mà vẫn chạm giới hạn, đó là lỗi cấu hình và nâng ngưỡng chính là cách sửa đúng.

Muốn tự đặt giới hạn thay vì chịu giới hạn của người khác?

Cloud VPS NVMe có IP riêng và quyền root đầy đủ — tự cấu hình cache và giới hạn theo từng endpoint. Từ ฿150/tháng.

Câu hỏi thường gặp

Sau khi nhận 429 thì nên chờ bao lâu?

Đọc header Retry-After — nó nói chính xác. Nếu không có, dùng exponential backoff kèm jitter: 1 giây, rồi 2, 4, 8, mỗi lần cộng thêm một lượng ngẫu nhiên nhỏ. Đừng bao giờ thử lại ngay lập tức; đó chính là thứ biến một đợt làm chậm tạm thời thành lệnh chặn hẳn.

429 là lỗi của tôi hay của máy chủ?

Thường thì không bên nào hỏng cả. Nó nghĩa là tốc độ yêu cầu của bạn vượt mức bên kia cho phép. Hãy kiểm tra xem code có gọi lặp lại không cần thiết mà cache có thể loại bỏ không; nếu tốc độ đó thực sự cần cho công việc, bạn cần gói cao hơn chứ không phải cách lách.

Vì sao tôi gửi rất ít yêu cầu mà vẫn bị 429?

Nhiều khả năng bạn dùng chung địa chỉ IP với người khác — shared hosting, NAT công ty, hay exit node của VPN — và giới hạn đếm theo địa chỉ chứ không theo bạn. Thử bằng dữ liệu di động sẽ xác nhận nhanh. Một số giới hạn cũng tính theo tài khoản thay vì theo IP, nên hãy kiểm tra xem có tiến trình khác dùng chung thông tin xác thực không.

429 có ảnh hưởng SEO không?

Có, nếu Googlebot nhận nó. Google hiểu 429 là tín hiệu phải chậm lại và sẽ giảm tốc độ thu thập; nếu kéo dài, các trang sẽ rơi khỏi chỉ mục. Hãy đảm bảo quy tắc rate limit của bạn miễn trừ các crawler tìm kiếm đã xác minh, và xem báo cáo Crawl stats trong Search Console để phát hiện các phản hồi này tăng đột biến.