נשאלתי על Rate Limiter ב-3 ראיונות שונים — הנה הגישה שעבדה
חצי שנה האחרונה עברתי כמה תהליכי גיוס ו-Rate Limiter עלה ב-3 מהם. החלטתי לתעד את הגישה שהכי עבדה.
למה שואלים דווקא את זה?
כי הוא ריאלי, אפשר לסיים אותו ב-45 דקות, ויש בו המון tradeoffs אמיתיים שמראים איך אתה חושב.
שלב 1 — Clarify requirements (2-3 דקות, לא לדלג)
- API-level או user-level limiting?
- Distributed system או single node?
- Hard block (429) או soft degrade?
- כמה latency overhead מותר?
שלב 2 — הצג אלגוריתמים, בחר עם הסבר
- Token Bucket — טוב ל-burst, קל לממש, אבל לא precise
- Sliding Window Log — מדויק, אבל memory-heavy בעומסים גבוהים
- Fixed Window Counter — הפשוט ביותר, יש לו edge case בגבול ה-window
- Sliding Window Counter — האמצע הזהב, זה מה שאני בוחר ומסביר למה
שלב 3 — ב-distributed setup
- Redis עם INCR + EXPIRE: קל ומהיר
- Race condition? → Lua script ב-Redis (atomic)
- מה קורה אם Redis נופל? Fail open / fail closed? חשוב לדון ב-tradeoff
שלב 4 — איפה רוב האנשים נכשלים
שוכחים לדבר על consistency ב-multi-region. אם יש לך 3 regions, האם ה-limit הוא global או per-region? אין תשובה אחת, אבל הדיון עצמו מרשים.
מוזמנים להוסיף / לתקן בתגובות.
מעולה. תוספת חשובה: Fixed Window edge case — בקשות בסוף window X + תחילת window X+1 יכולות יחד לחרוג מה-limit. זה לא bug theoretic, ראיתי את זה בפרודקשן.