နားလည်ထားရမယ့် အချက်
Rate limit ကို user/IP/API key နှင့် time window အလိုက် counter ထားနိုင်ပါတယ်။ `INCR` နဲ့ `EXPIRE` သီးခြားလုပ်ရင် crash gap ရှိလို့ Lua script ဖြင့် atomic လုပ်ရပါတယ်။ Fixed window ကရိုးရှင်းသော်လည်း boundary burst ရှိပြီး sliding window/log သို့ token bucket ကပိုချောမွေ့ပေမယ့် cost ပိုများပါတယ်။
လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်
Login endpoint ကို user+IP အလိုက် 60 seconds တွင် 10 requests ကန့်သတ်မယ်။ Script က counter တိုး၊ first request တွင် expiry ပေးပြီး count/TTL ပြန်ပေးမယ်။ API response တွင် limit, remaining နဲ့ retry-after headers ထည့်မယ်။
အတူတူ စမ်းရေးကြည့်မယ်
local count = redis.call('INCR', KEYS[1])
if count == 1 then redis.call('EXPIRE', KEYS[1], ARGV[1]) end
local ttl = redis.call('TTL', KEYS[1])
return {count, ttl}
-- EVALSHA <sha> 1 rl:login:user42:iphash 60Request count နဲ့ remaining window TTL ကို atomic ရမည်။၅ မိနစ် စမ်းကြည့်
Anonymous search အတွက် IP limiter နဲ့ authenticated export အတွက် user limiter policy နှစ်ခုရေးပါ။
သတိလေးတစ်ချက်
Proxy header ကို blind trust လုပ်ပြီး IP key သတ်မှတ်ရင် attacker က header ပြောင်း၍ limiter ရှောင်နိုင်ပါတယ်။
Redis — Rate Limiting — Redis