슬라이딩윈도우로그란?
- 고정된 크기의 시간 구간(윈도우)을 일정 간격으로 이동시키며, 윈도우 안에 포함된 이벤트(데이터)를 기준으로 요청을 허용하거나 차단하는 알고리즘입니다.
즉 최근 N ms 동안 최대 M번만 허용같은 제약을 정밀하게 구현할 때 활용됩니다.
조건사항
- 모든 이벤트는 timestamp 형태로 기록
- ms까지 시간을 계산한다.
- 데이터는 데이터베이스에 저장된다고 가정하고, 동시 접근 시 락으로 경쟁상태를 방지
코드
동작과정
- 일정한 윈도우 시간과 개수를 정해서 트래픽을 관리한다.
- 시간이 흐르면 윈도우내에 해당 시간은 삭제한다.
- limit시간을 초과해서 쌓지는 않는다.
- 요청시 윈도우 내에 허용범위이면 deque에 담고, 없으면 거부하고 대기시간을 알려준다.
import time
import threading
from collections import defaultdict, deque
from rateLimiter import Result
class SlidingWindowLog:
def __init__(self, limit: int, window_ms: int):
self.limit = int(limit)
self.window_ms = int(window_ms)
self._queue_ms = defaultdict(deque)
self._locks = defaultdict(threading.Lock)
def allow(self, key: str) -> Result:
dq = self._queue_ms[key]
lock = self._locks[key]
now_ms = int(time.time() * 1000)
cutoff = now_ms - self.window_ms
with lock:
while dq and dq[0] < cutoff:
dq.popleft()
if len(dq) < self.limit:
dq.append(now_ms)
remaining = self.limit - len(dq)
return Result(True, remaining, 0)
else:
oldest = dq[0]
retry_ms = self.window_ms - (now_ms - oldest)
return Result(False, 0, max(1, retry_ms))
- limit : 윈도우 내에 채울수 있는 개수
- window_ms : 윈도우 제한을 걸어줄 시간
- queue_ms : 각각 key 마다 dict로 구별하고 deque에 넣는다.
- locks : 여러 요청이 동시에 접근할 때 경쟁상태를 막기 위한 락
요약
- 시간은 timestamp로 기록해 데이터베이스에 저장할수 있도록 설계함
'IT > 백엔드' 카테고리의 다른 글
| Java - Builder Pattern 유의사항 (2) | 2025.07.16 |
|---|---|
| Java - MultipleBagFetchException 중복 조회 문제 (@OneToMany, LAZY) (8) | 2025.07.14 |
| 트래픽에 따른 Scale out 전략 (0) | 2025.05.31 |
| java 1.8 리스트 비교 (2) | 2025.05.28 |
| [ node.js ] - 메모리 관리법 (0) | 2025.02.04 |