Leaky Bucket

이 μ•Œκ³ λ¦¬μ¦˜μ˜ 핡심 μ•„μ΄λ””μ–΄λŠ”, "μš”μ²­μ„ '큐(Queue)'에 담아두고, μ •ν•΄μ§„ 처리 속도(Rate)에 맞좰 μˆœμ„œλŒ€λ‘œ μΌμ •ν•˜κ²Œ μ²˜λ¦¬ν•˜λŠ” 방식" μž…λ‹ˆλ‹€. 핡심은 '평균 속도'κ°€ μ•„λ‹ˆλΌ 'κ³ μ •λœ 속도'둜 μš”μ²­μ„ μ²˜λ¦¬ν•˜μ—¬ νŠΈλž˜ν”½μ„ 평탄화(smoothing)ν•˜λŠ” 데 μžˆμŠ΅λ‹ˆλ‹€.

이름 κ·ΈλŒ€λ‘œ "ꡬ멍이 μƒŒ(Leaky) 양동이"에 λΉ„μœ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • 양동이 (Bucket): μš”μ²­μ„ μˆœμ„œλŒ€λ‘œ λ‹΄λŠ” 큐(Queue)μž…λ‹ˆλ‹€. (μ •ν•΄μ§„ 크기 쑴재)

  • λ¬Ό (Water): μ‹œμŠ€ν…œμ— λ“€μ–΄μ˜€λŠ” μš”μ²­μž…λ‹ˆλ‹€. (λΆˆκ·œμΉ™ν•˜κ²Œ λ“€μ–΄μ˜¬ 수 있음)

  • ꡬ멍 (Leak): μ •ν•΄μ§„ 속도(예: 1μ΄ˆμ— 1개)둜 μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” μž₯μΉ˜μž…λ‹ˆλ‹€. 물이 μΌμ •ν•œ μ†λ„λ‘œλ§Œ λΉ μ Έλ‚˜κ°‘λ‹ˆλ‹€.

  • λ„˜μΉ¨ (Overflow): μš”μ²­μ΄ λ„ˆλ¬΄ 빨리 듀어와 양동이(큐)κ°€ 가득 μ°¨λ©΄, μƒˆλ‘œ λ“€μ–΄μ˜€λŠ” λ¬Ό(μš”μ²­)은 λ²„λ €μ§‘λ‹ˆλ‹€(κ±°λΆ€).

λ™μž‘ 방식

  1. 큐(Queue) 생성: μ •ν•΄μ§„ 크기(Capacity)λ₯Ό κ°€μ§„ FIFO(First-In, First-Out) 큐λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

  2. μš”μ²­ μˆ˜μ‹  및 큐 μΆ”κ°€: μš”μ²­μ΄ λ“€μ–΄μ˜€λ©΄, 큐에 빈 곡간이 μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

    • 곡간 있음 (Allow): 큐의 맨 뒀에 μš”μ²­μ„ μΆ”κ°€ν•©λ‹ˆλ‹€.

    • 곡간 μ—†μŒ (Deny): 큐가 가득 μ°ΌμœΌλ―€λ‘œ, μƒˆλ‘œμš΄ μš”μ²­μ„ κ±°λΆ€(Overflow)ν•©λ‹ˆλ‹€.

  3. μΌμ •ν•œ μ†λ„λ‘œ 처리: λ³„λ„μ˜ 처리기(Processor)κ°€ 큐의 맨 μ•žμ—μ„œλΆ€ν„° κ³ μ •λœ 속도(예: 1μ΄ˆλ‹Ή 1개)둜 μš”μ²­μ„ κΊΌλ‚΄μ–΄ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

    • 이 처리 μ†λ„λŠ” μš”μ²­μ΄ μ–Όλ§ˆλ‚˜ 많이 큐에 μŒ“μ—¬μžˆλŠ”μ§€μ™€ 관계없이 항상 μΌμ •ν•©λ‹ˆλ‹€.

πŸ‘ μž₯점

  • μ•ˆμ •μ μΈ νŠΈλž˜ν”½ 처리 (νŠΈλž˜ν”½ 평탄화): 이 μ•Œκ³ λ¦¬μ¦˜μ˜ κ°€μž₯ 큰 μž₯μ μž…λ‹ˆλ‹€. μš”μ²­μ΄ μˆœκ°„μ μœΌλ‘œ 폭주(Burst)ν•˜λ”λΌλ„, μ‹€μ œ μ‹œμŠ€ν…œ(μ„œλ²„)은 항상 μΌμ •ν•œ μ†λ„λ‘œ μš”μ²­μ„ λ°›κ²Œ λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 μ‹œμŠ€ν…œμ„ κ³ΌλΆ€ν•˜λ‘œλΆ€ν„° μ•ˆμ •μ μœΌλ‘œ λ³΄ν˜Έν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • 예츑 κ°€λŠ₯μ„±: μ‹œμŠ€ν…œμ΄ μ²˜λ¦¬ν•˜λŠ” μš”μ²­ 속도가 κ³ μ •λ˜μ–΄ μžˆμ–΄, λΆ€ν•˜λ₯Ό 맀우 μ‰½κ²Œ μ˜ˆμΈ‘ν•˜κ³  관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

  • μš”μ²­ μˆœμ„œ 보μž₯: FIFO 큐λ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ, 큐에 λ“€μ–΄μ˜¨ μš”μ²­μ€ μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬λ©λ‹ˆλ‹€.

πŸ‘Ž 단점

  • λ²„μŠ€νŠΈ νŠΈλž˜ν”½ λΆˆν—ˆ: 토큰 버킷과 μ •λ°˜λŒ€λ˜λŠ” λ‹¨μ μž…λ‹ˆλ‹€. μ‹œμŠ€ν…œμ΄ μ˜€λž«λ™μ•ˆ 유휴 μƒνƒœμ—¬μ„œ 처리 μ—¬λ ₯이 λ‚¨μ•„μžˆμ–΄λ„, μˆœκ°„μ μœΌλ‘œ λͺ°λ¦° μš”μ²­μ„ μ •ν•΄μ§„ 속도보닀 λΉ λ₯΄κ²Œ μ²˜λ¦¬ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

  • μš”μ²­ μ§€μ—° (Latency): λͺ¨λ“  μš”μ²­μ€ μ¦‰μ‹œ μ²˜λ¦¬λ˜μ§€ μ•Šκ³  일단 큐에 λŒ€κΈ°ν•΄μ•Ό ν•©λ‹ˆλ‹€. 큐가 κΈΈμ–΄μ§ˆμˆ˜λ‘ μš”μ²­μ΄ μ²˜λ¦¬λ˜κΈ°κΉŒμ§€μ˜ λŒ€κΈ° μ‹œκ°„(Latency)이 κΈΈμ–΄μ§‘λ‹ˆλ‹€.

  • 였래된 μš”μ²­ 문제 (Stale Request): 큐에 μš”μ²­μ΄ λ„ˆλ¬΄ 였래 머무λ₯΄λ©΄, 막상 처리될 μ‹œμ μ—λŠ” 이미 νƒ€μž„μ•„μ›ƒ λ“±μœΌλ‘œ 인해 의미 μ—†λŠ” μš”μ²­μ΄ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ’₯ κ²°κ³Ό: Token Bucketκ³Ό 핡심 차이

두 μ•Œκ³ λ¦¬μ¦˜μ€ λΉ„μŠ·ν•΄ λ³΄μ΄μ§€λ§Œ λͺ©μ μ΄ λ‹€λ¦…λ‹ˆλ‹€.

  • 토큰 버킷 (Token Bucket): "평균 속도"λ₯Ό μ œμ–΄ν•˜λ©° λ²„μŠ€νŠΈ(Burst)λ₯Ό ν—ˆμš©ν•©λ‹ˆλ‹€. (토큰이 λͺ¨μ—¬μžˆμœΌλ©΄ ν•œ λ²ˆμ— μ‚¬μš© κ°€λŠ₯)

  • 리킀 버킷 (Leaky Bucket): "κ³ μ •λœ 좜λ ₯ 속도"λ₯Ό κ°•μ œν•˜λ©° λ²„μŠ€νŠΈλ₯Ό 평탄화(Smoothing)ν•©λ‹ˆλ‹€. (μš”μ²­μ΄ 아무리 λ§Žμ•„λ„ 처리 μ†λ„λŠ” 일정)

Last updated