0Pricing
C# Academy · บทเรียน

อัลกอริทึมจำกัดอัตรา

เปรียบเทียบตัวจำกัดแบบคงที่ แบบเลื่อน แบบโทเค็น และแบบจำกัดการทำงานพร้อมกัน

อัลกอริทึมจำกัดอัตรา เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงต้องจำกัดอัตรา

การจำกัดอัตราจะจำกัดจำนวนคำขอที่ไคลเอ็นต์ส่งได้ภายในช่วงเวลาหนึ่ง วิธีนี้ช่วยปกป้อง API จากการใช้งานในทางที่ผิด ไคลเอ็นต์ที่ส่งคำขอมากเกินควบคุม และการพุ่งขึ้นของปริมาณการใช้งานโดยไม่ตั้งใจ อีกทั้งยังช่วยแบ่งความจุให้ผู้ใช้แต่ละรายอย่างเป็นธรรม

// e.g. allow 100 requests per minute per API key

การจำกัดอัตราที่มีมาให้ในตัว

ตั้งแต่ .NET 7 เป็นต้นมา ASP.NET Core มาพร้อมมิดเดิลแวร์จำกัดอัตราแบบครบถ้วนใน Microsoft.AspNetCore.RateLimiting ซึ่งมีอัลกอริทึมในตัวสี่แบบ

// Algorithms: Fixed Window, Sliding Window,
//             Token Bucket, Concurrency

ช่วงเวลาคงที่

อัลกอริทึมแบบ ช่วงเวลาคงที่อนุญาตให้ส่งคำขอจำนวน N รายการต่อช่วงเวลาที่กำหนดไว้ เมื่อช่วงเวลาสิ้นสุด ตัวนับจะกลับไปเป็นศูนย์

วิธีนี้เรียบง่าย แต่การส่งคำขอเป็นชุดตรงรอยต่อของช่วงเวลาอาจทำให้อัตราที่เกิดขึ้นจริงเพิ่มเป็นสองเท่าชั่วครู่

// 10 requests per 60s window
// All 10 used at 0:59, 10 more at 1:00 -> 20 in 2 seconds

ช่วงเวลาเลื่อน

ช่วงเวลาเลื่อนช่วยลดปัญหาที่รอยต่อด้วยการแบ่งช่วงเวลาออกเป็นส่วนย่อย แล้วเลื่อนส่วนที่หมดอายุออกไปเรื่อย ๆ ทำให้ข้อจำกัดมีผลกับช่วงเวลาต่อเนื่องใด ๆ

// 10 requests per 60s, 6 segments of 10s each
// The count slides as each segment expires

บัคเก็ตโทเค็น

บัคเก็ตโทเค็นจะเก็บโทเค็นไว้ในบัคเก็ต คำขอแต่ละรายการจะใช้โทเค็นหนึ่งรายการ และโทเค็นจะถูกเติมกลับด้วยอัตราคงที่ วิธีนี้อนุญาตให้มีการส่งคำขอเป็นชุดสั้น ๆ ได้ไม่เกินขนาดบัคเก็ต พร้อมควบคุมค่าเฉลี่ยในระยะยาว

// Bucket = 10 tokens, refill 5 tokens / 10s
// Burst of 10 allowed, then 5 every 10 seconds

ตัวจำกัดการทำงานพร้อมกัน

ตัวจำกัดแบบ การทำงานพร้อมกันแตกต่างออกไป เพราะจะจำกัดจำนวนคำขอที่กำลังประมวลผล ในเวลาเดียวกัน ไม่ใช่จำนวนคำขอต่อหน่วยเวลา จึงเหมาะสำหรับปกป้องการดำเนินการที่ใช้ทรัพยากรมาก

// At most 5 concurrent requests in flight
// The 6th waits in the queue or is rejected

คิว

ตัวจำกัดแต่ละแบบสามารถ เข้าคิวคำขอที่เกินขีดจำกัด แทนที่จะปฏิเสธทันที QueueLimit กำหนดขนาดคิว และ QueueProcessingOrder กำหนดความเป็นธรรมของคิวว่าจะจัดการรายการเก่าที่สุดหรือใหม่ที่สุดก่อน

// QueueLimit = 2, OldestFirst
// Over-limit requests wait if a slot exists, else get 503/429

การเลือกอัลกอริทึม

เลือกอัลกอริทึมให้ตรงกับเป้าหมาย:

  • ช่วงเวลาคงที่: เรียบง่ายที่สุด และเพียงพอสำหรับหลายกรณี
  • ช่วงเวลาเลื่อน: นุ่มนวลกว่า และหลีกเลี่ยงการพุ่งขึ้นของคำขอตรงรอยต่อ
  • บัคเก็ตโทเค็น: อนุญาตให้ส่งคำขอเป็นชุดได้อย่างควบคุม
  • การทำงานพร้อมกัน: จำกัดโหลดที่เกิดขึ้นพร้อมกัน ไม่ใช่อัตรา
// Bursty clients -> token bucket
// Expensive endpoint -> concurrency

การแบ่งส่วน

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

// Partition by user id, IP, or API key
// Each partition gets its own independent counter

สิ่งที่ไคลเอ็นต์เห็น

คำขอที่ถูกปฏิเสธจะส่งคืน HTTP 429 Too Many Requests API ที่ออกแบบมาอย่างดีจะส่งส่วนหัว Retry-After กลับมาด้วย เพื่อบอกไคลเอ็นต์ว่าควรลองใหม่เมื่อใด

// HTTP/1.1 429 Too Many Requests
// Retry-After: 30

การจำกัดอัตราเทียบกับการชะลอและโควตา

แนวคิดเหล่านี้เกี่ยวข้องกัน: การจำกัดอัตราจำกัดความถี่ในระยะสั้น โควตาจำกัดยอดรวมในระยะยาว เช่น ต่อวันหรือต่อเดือน และ การชะลอจะลดความเร็วแทนการปฏิเสธ มิดเดิลแวร์นี้มุ่งเน้นการจำกัดอัตรา

// rate limit: 100/min   quota: 10000/day

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจเกี่ยวกับอัลกอริทึม

สรุปทบทวน

คุณได้เรียนรู้แนวคิดเกี่ยวกับการจำกัดอัตราแล้ว:

  • อัลกอริทึมสี่แบบ ได้แก่ ช่วงเวลาคงที่, ช่วงเวลาเลื่อน, บัคเก็ตโทเค็น และ การทำงานพร้อมกัน
  • บัคเก็ตโทเค็นอนุญาตให้มีการส่งคำขอเป็นชุด ส่วนการทำงานพร้อมกันจะจำกัดโหลดที่เกิดขึ้นพร้อมกัน
  • ข้อจำกัดใช้กับ คีย์แบ่งส่วนแต่ละรายการ และคิวช่วยรองรับคำขอส่วนเกิน
  • คำขอที่ถูกปฏิเสธจะได้รับ 429 พร้อมกับ Retry-After

ถัดไป: การกำหนดค่ามิดเดิลแวร์

คำถามที่พบบ่อย

บทเรียน “อัลกอริทึมจำกัดอัตรา” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “อัลกอริทึมจำกัดอัตรา” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “อัลกอริทึมจำกัดอัตรา”

เปรียบเทียบตัวจำกัดแบบคงที่ แบบเลื่อน แบบโทเค็น และแบบจำกัดการทำงานพร้อมกัน คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “อัลกอริทึมจำกัดอัตรา” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. อัลกอริทึมจำกัดอัตรา
  2. การกำหนดค่ามิดเดิลแวร์จำกัดอัตรา
  3. พื้นฐานการแคชผลลัพธ์
  4. นโยบายแคชและการทำให้แคชใช้ไม่ได้
← กลับไปที่ C# Academy