Quest 71 - Rate Limiter for LLM APIs
Quest 71: Rate Limiter for LLM APIs
medium 25-30 minutes🎯 Learning Objectives
- สร้าง token bucket rate limiter ที่ refill tokens ตามเวลา
- เข้าใจ token bucket algorithm — consume, refill, max capacity
- รู้จัก retry-after calculation — บอกว่าต้องรอนานแค่ไหน
- ออกแบบ rate limiter ที่ป้องกัน budget overrun
📖 Concept: Token Bucket Rate Limiter
Rate Limiter คือ guardian ของ LLM API budget — มันป้องกันไม่ให้ app ของคุณ ยิง API เร็วเกินไป จนเกิน rate limit หรือหมด budget
Token Bucket Algorithm ทำงานแบบนี้:
- Bucket มี tokens สูงสุด
maxTokens - Tokens refill ช้าๆ ตามเวลา (
refillRatetokens/วินาที) - ทุก request ต้อง consume tokens — ถ้าไม่พอ = denied
const limiter = createRateLimiter({ maxTokens: 10, refillRate: 2, // 2 tokens ต่อวินาที});
limiter.consume(5); // { allowed: true, remaining: 5, retryAfter: 0 }limiter.consume(8); // { allowed: false, remaining: 5, retryAfter: 1.5 }⚙️ How It Works
Token Bucket Algorithm
1. consume(tokens) — พยายามใช้ tokens ↓2. ถ้า tokens >= allowed → allowed! deduct tokens ถ้า tokens < allowed → denied! คำนวณ retryAfter ↓3. Refill — tokens กลับมาช้าๆ ตาม refillRate ↓4. available() — ดูว่ามี tokens เท่าไหร่ตอนนี้ ↓5. reset() — รีเซ็ต bucket เต็มใหม่Token Bucket vs Fixed Window
// ❌ Fixed Window — ไม่ refill ตามเวลา// ใช้ 10 requests ต่อนาที แล้ว reset ทุกนาที// ปัญหา: ใช้ 10 requests ใน 1 วินาทีแรก = รอ 59 วินาที
// ✅ Token Bucket — refill ช้าๆ// ใช้ tokens ได้เรื่อยๆ จนกว่าจะหมด// refill 2 tokens/วินาที = รอไม่นานก็ใช้ได้ใหม่💡 Example: Rate Limiter ใน action
const limiter = createRateLimiter({ maxTokens: 10, refillRate: 2, // 2 tokens ต่อวินาที});
// เริ่มต้นด้วย tokens เต็มconsole.log(limiter.available()); // 10
// ใช้ 5 tokensconst r1 = limiter.consume(5);console.log(r1);// { allowed: true, remaining: 5, retryAfter: 0 }
// ใช้อีก 8 tokens — ไม่พอ!const r2 = limiter.consume(8);console.log(r2);// { allowed: false, remaining: 5, retryAfter: 1.5 }// ต้องรอ 1.5 วินาที ถึงจะมี tokens พอ (3 tokens needed ÷ 2/sec = 1.5s)
// รีเซ็ตlimiter.reset();console.log(limiter.available()); // 10⚠️ Common Mistakes
Mistake 1: ใช้ fixed window แทน token bucket
“Reset ทุกวินาทีก็พอ” → Token bucket refill ช้าๆ — ไม่ใช่ reset ทั้งหมดพร้อมกัน
Mistake 2: ไม่คำนวณ retryAfter
“Just deny when no tokens” → ต้องบอกว่าต้องรอนานแค่ไหน — app จะได้ retry ถูกเวลา
Mistake 3: Refill ไม่ได้ update ตามเวลาจริง
“Refill เมื่อมี request เท่านั้น” → Refill ต้องคำนวณจาก elapsed time — ไม่ใช่แค่ตอน request
Mistake 4: Max tokens ไม่ limit
“Tokens ไม่มีวันหมด” → Bucket ต้องมี maxTokens — ไม่เช่นนั้น refill ไม่จำกัด = ไม่ใช่ rate limit
📝 Knowledge Check
📝 Knowledge Check
Q1:Token Bucket Algorithm ทำงานอย่างไร?
Q2:retryAfter คำนวณอย่างไร?
Q3:Token Bucket ดีกว่า Fixed Window อย่างไร?
🏋️ Quest: Rate Limiter for LLM APIs
สร้าง token bucket rate limiter ที่ refill tokens ตามเวลาจริง
-
Download ไฟล์เริ่มต้นของ quest:
Terminal window npx bluebeltdojo download quest-71-rate-limitercd quest-71-rate-limiter -
เปิด
problem.jsใน editor ของคุณพร้อม AI tool -
Implement
createRateLimiter(config)ตาม instructions ในproblem.js -
ตรวจสอบ solution ของคุณ:
Terminal window node test.js -
สำคัญ! ทดสอบ edge case: tokens refill ตามเวลาจริง (ไม่ใช่ reset ทั้งหมด)
-
แก้ไขจน tests ทุกตัวผ่าน
-
ส่งคำตอบ:
Terminal window npx bluebeltdojo submit
💡 Tip: ลองนึกถึง scenario ที่ผ่านไป 3 วินาที — tokens ควร refill 6 tokens (3s × 2/s) ไม่ใช่ reset เป็น 10
คำใบ้
- อ่าน instructions ใน
problem.jsอย่างละเอียด - Refill ต้องคำนวณจาก elapsed time:
tokens += elapsed * refillRate - Tokens ต้องไม่เกิน maxTokens
- retryAfter =
(tokensNeeded - available) / refillRate - ถ้าติดขัด ลองอ่าน “Common Mistakes” อีกครั้ง