Sliding Window Log

Sliding Window CounterλŠ” μ›€μ§μ΄λŠ” μ‹œκ°„ ꡬ간을 μœ μ§€ν•˜μ§€λ§Œ, Sliding Window LogλŠ” μ‹œκ°„ λ‹¨μœ„λ₯Ό μ„Έλ°€ν•˜κ²Œ μ œμ–΄ν•œλ‹€. μΆ”μ •ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, μ‹€μ œ λͺ¨λ“  기둝을 일일이 ν™•μΈν•˜μ—¬ κ°€μž₯ μ •ν™•ν•˜κ²Œ νŒλ‹¨ν•œλ‹€.

  • 둜그 (Log): 각 μš”μ²­μ΄ λ“€μ–΄μ˜¨ μ •ν™•ν•œ μ‹œκ°„(νƒ€μž„μŠ€νƒ¬ν”„)을 μˆœμ„œλŒ€λ‘œ λͺ¨λ‘ μ €μž₯ν•œλ‹€.

  • μŠ¬λΌμ΄λ”© μœˆλ„μš° (Sliding Window): 항상 'ν˜„μž¬ μ‹œκ°„'을 κΈ°μ€€μœΌλ‘œ, 과거의 νŠΉμ • μ‹œκ°„ λ²”μœ„(예: μ§€λ‚œ 1λΆ„)λ₯Ό λ™μ μœΌλ‘œ μ„€μ •ν•œλ‹€.

  • μ •ν™•ν•œ 카운트 (Precise Count): 이 동적 μ‹œκ°„ λ²”μœ„ μ•ˆμ— ν¬ν•¨λœ 둜그(νƒ€μž„μŠ€νƒ¬ν”„)의 개수λ₯Ό μ •ν™•νžˆ μ„Όλ‹€.

핡심 아이디어

이 μ•Œκ³ λ¦¬μ¦˜μ˜ 핡심 μ•„μ΄λ””μ–΄λŠ”, "ν˜„μž¬ μ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ μ§€λ‚œ μœˆλ„μš° μ‹œκ°„ λ™μ•ˆ λ°œμƒν•œ λͺ¨λ“  μš”μ²­μ˜ νƒ€μž„μŠ€νƒ¬ν”„λ₯Ό μ‹€μ œλ‘œ κΈ°λ‘ν•˜κ³ , κ·Έ 기둝의 개수λ₯Ό μ„Έμ–΄ ν•œλ„λ₯Ό μ œμ–΄ν•˜λŠ” 것" 이닀.

λ™μž‘ 방식

  1. νƒ€μž„μŠ€νƒ¬ν”„ 기둝: μš”μ²­μ΄ λ“€μ–΄μ˜€λ©΄, ν˜„μž¬ μ‹œκ°„μ„ νƒ€μž„μŠ€νƒ¬ν”„λ‘œ λ³€ν™˜ν•˜μ—¬ 둜그(보톡 Redis의 Sorted Set 같은 자료ꡬ쑰)에 μ €μž₯ν•œλ‹€.

  2. 였래된 둜그 제거: ν˜„μž¬ μœˆλ„μš°μ˜ μ‹œμž‘ μ‹œκ°„λ³΄λ‹€ 였래된 νƒ€μž„μŠ€νƒ¬ν”„ λ‘œκ·ΈλŠ” λͺ¨λ‘ μ‚­μ œν•˜μ—¬ 항상 μ΅œμ‹  둜그만 μœ μ§€ν•œλ‹€.

  3. 둜그 개수 카운트: ν˜„μž¬ μœˆλ„μš° λ²”μœ„ 내에 λ‚¨μ•„μžˆλŠ” 둜그의 총개수λ₯Ό μ„Όλ‹€.

  4. ν•œλ„ 확인: 이 κ°œμˆ˜κ°€ μ„€μ •λœ ν•œλ„(Limit)보닀 μž‘μ€μ§€ ν™•μΈν•œλ‹€.

    • ν—ˆμš© (Allow): ν•œλ„ 이내라면 μš”μ²­μ„ μ²˜λ¦¬ν•œλ‹€. (1번 λ‹¨κ³„μ—μ„œ 이미 λ‘œκ·ΈλŠ” κΈ°λ‘λ˜μ—ˆμŒ)

    • κ±°λΆ€ (Deny): ν•œλ„λ₯Ό μ΄ˆκ³Όν–ˆλ‹€λ©΄, 방금 κΈ°λ‘ν•œ νƒ€μž„μŠ€νƒ¬ν”„λ₯Ό λ‹€μ‹œ μ‚­μ œν•˜κ³  μš”μ²­μ„ κ±°λΆ€ν•œλ‹€.

πŸ‘ μž₯점

  • μ™„λ²½ν•œ μ •ν™•μ„±: λͺ¨λ“  μš”μ²­μ„ κΈ°λ‘ν•˜κ³  μ„ΈκΈ° λ•Œλ¬Έμ—, μΆ”μ • λ°©μ‹μ—μ„œ λ°œμƒν•˜λŠ” μ˜€μ°¨κ°€ μ „ν˜€ μ—†λ‹€. 이둠적으둜 κ°€μž₯ μ™„λ²½ν•œ Rate Limiting을 μ œκ³΅ν•œλ‹€.

  • μœ μ—°μ„±: μœˆλ„μš° 경계 λ¬Έμ œκ°€ μ•„μ˜ˆ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©°, μ–΄λ–€ νŠΈλž˜ν”½ νŒ¨ν„΄μ—λ„ μ •ν™•ν•˜κ²Œ λŒ€μ‘ν•œλ‹€.

πŸ‘Ž 단점

  • 높은 λ©”λͺ¨λ¦¬ λΉ„μš©:

    • μœˆλ„μš° λ‚΄μ˜ λͺ¨λ“  μš”μ²­ νƒ€μž„μŠ€νƒ¬ν”„λ₯Ό μ €μž₯ν•΄μ•Ό ν•œλ‹€.

    • λ§Œμ•½ λΆ„λ‹Ή 10,000개의 μš”μ²­μ„ ν—ˆμš©ν•œλ‹€λ©΄, μ‚¬μš©μž ν•œ λͺ…λ‹Ή μ΅œλŒ€ 10,000개의 νƒ€μž„μŠ€νƒ¬ν”„ 데이터λ₯Ό λ©”λͺ¨λ¦¬μ— μœ μ§€ν•΄μ•Ό ν•˜λ―€λ‘œ λΉ„μš©μ΄ 맀우 λΉ„μ‹Έλ‹€.

  • 계산 λΆ€ν•˜:

    • μš”μ²­λ§ˆλ‹€ 둜그λ₯Ό μΆ”κ°€ν•˜κ³ , λ²”μœ„λ₯Ό κ³„μ‚°ν•˜μ—¬ 개수λ₯Ό μ„ΈλŠ” κ³Όμ •μ—μ„œ μ•½κ°„μ˜ 계산 λΆ€ν•˜κ°€ λ°œμƒν•  수 μžˆλ‹€.

μ˜ˆμ‹œ

  • κ·œμΉ™: 1λΆ„λ‹Ή 10개의 μš”μ²­ ν—ˆμš© (Window 크기 = 60초, Limit = 10)

  • 상황: ν˜„μž¬ μ‹œκ°„ 12:01:15. μ§€λ‚œ 1λΆ„ λ™μ•ˆ λ‹€μŒκ³Ό 같은 μš”μ²­ 기둝(νƒ€μž„μŠ€νƒ¬ν”„)이 λ‘œκ·Έμ— μ €μž₯λ˜μ–΄ 있음

    • [12:00:20, 12:00:35, 12:00:58, 12:00:59, 12:01:01, 12:01:05, 12:01:10]

  • μƒˆλ‘œμš΄ μš”μ²­ 도착: 12:01:15에 μƒˆλ‘œμš΄ μš”μ²­μ΄ 1개 λ“€μ–΄μ˜¨λ‹€.

  • μ•Œκ³ λ¦¬μ¦˜μ˜ νŒλ‹¨:

    1. ν˜„μž¬ μœˆλ„μš° λ²”μœ„ μ„€μ •: 12:00:15 ~ 12:01:15

    2. λ²”μœ„ λ‚΄ 둜그 필터링: κΈ°μ‘΄ 둜그 쀑 이 λ²”μœ„μ— ν•΄λ‹Ήν•˜λŠ” 기둝만 ν™•μΈν•œλ‹€.

      • [12:00:20, 12:00:35, 12:00:58, 12:00:59, 12:01:01, 12:01:05, 12:01:10] -> 총 7개

    3. 카운트 확인: ν˜„μž¬ 둜그 κ°œμˆ˜λŠ” 7개둜, ν•œλ„ 10κ°œλ³΄λ‹€ μž‘λ‹€.

    4. 처리: μš”μ²­μ„ ν—ˆμš©ν•˜κ³ , μƒˆλ‘œμš΄ νƒ€μž„μŠ€νƒ¬ν”„ 12:01:15λ₯Ό λ‘œκ·Έμ— μΆ”κ°€ν•œλ‹€.

      • [..., 12:01:05, 12:01:10, 12:01:15]

Last updated