การออกแบบ Rate Limit สำหรับเว็บแอปพลิเคชัน

enter image description here

Rate Limit คืออะไร?

การจำกัดจำนวนครั้งที่ผู้ใช้สามารถเรียกใช้ API หรือหน้าเว็บของเราได้ในช่วงเวลาหนึ่งๆ เปรียบเหมือน รถไฟฟ้าให้ขึ้นได้แค่ 100 คนต่อขบวน ป้องกันไม่ให้แน่นจนระบบล่ม

ทำไมต้องมี Rate Limit?

  • ป้องกันบอทหรือผู้ไม่ประสงค์ดีสแปมข้อมูล
  • ป้องกันการดึงข้อมูลหมดระบบในครั้งเดียว (เช่น ดาวน์โหลดฐานข้อมูลทั้งตัว)
  • ทำให้ระบบเสถียร ใช้ทรัพยากรได้เท่าๆกันทุกคน
  • ประหยัดค่าใช้จ่าย (ลดการเรียกใช้ฐานข้อมูลหรือ API ภายนอกแบบฟุ่มเฟือย)

เทคนิคพื้นฐานที่ควรรู้ (เลือกใช้อันใดอันหนึ่ง)

เทคนิค หลักการ เหมาะกับ
Fixed Window นับจำนวน request ใน 1 นาที เช่น 100 ครั้ง พอครบนาทีถัดไปเริ่มนับใหม่ ระบบทั่วไป ใช้งานง่ายที่สุด
Sliding Window สมมติจำกัด 100 ครั้งต่อ 60 วินาที คุณส่งครั้งแรกเวลา 10:00:30 ครั้งที่ 101 จะส่งได้ตอน 10:01:30 เป็นต้นไป (ไม่ใช่รอแค่ข้ามนาที) API ที่ต้องแม่นยำสูง, ระบบ payment, login, หรือระบบที่คนพยายามเล่นช่องโหว่เรื่องเวลา
Token Bucket มีโทเค็น 100 อัน แต่ละ request ใช้ 1 อัน โทเค็นเติมทีละ 10 อันทุกวินาที รองรับการใช้งานเป็นพักๆ (burst) เช่น ตอนเปิดแอปแล้วโหลดพร้อมกันหลายอย่าง
Leaky Bucket Request เข้ามาเท่าไหร่ก็ได้ แต่ส่งออกไปที่เซิร์ฟเวอร์ด้วยอัตราคงที่ ระบบที่ต้องรักษาจังหวะ steady เช่น การสตรีมข้อมูล

แนะนำสำหรับมือใหม่: เริ่มจาก Fixed Window หรือ Token Bucket ง่ายต่อการเข้าใจและ implement

ควรจำกัดที่ระดับไหนบ้าง? (เลือกให้เหมาะกับแอป)

  1. จำกัดตาม IP ใช้ง่ายที่สุด แต่คนใช้ WiFi ร่วมกันอาจโดนจำกัดพร้อมกัน ตัวอย่าง: 100 req/min ต่อ IP

  2. จำกัดตาม User ID (หรือ API Key) แม่นยำกว่า เหมาะกับแอปที่มีการล็อกอิน ตัวอย่าง: 500 req/min ต่อ user

  3. จำกัดแยกตาม endpoint endpoint เสี่ยงสูง เช่น /login อาจให้แค่ 5 ครั้ง/นาที ส่วน /search ให้ 100 ครั้ง/นาที

  4. แบบผสม เช่น จำกัด IP ไว้ 200 req/min แต่ถ้าเป็น user พรีเมียมให้ 1000 req/min


ภาพประกอบ: 1