อัลกอริทึมจำกัดอัตรา
เปรียบเทียบตัวจำกัดแบบคงที่ แบบเลื่อน แบบโทเค็น และแบบจำกัดการทำงานพร้อมกัน
อัลกอริทึมจำกัดอัตรา เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- อัลกอริทึมจำกัดอัตรา
- การกำหนดค่ามิดเดิลแวร์จำกัดอัตรา
- พื้นฐานการแคชผลลัพธ์
- นโยบายแคชและการทำให้แคชใช้ไม่ได้