🚦 μ„œλ²„ κ³ΌλΆ€ν•˜λ₯Ό λ§‰λŠ” 처리율 μ œν•œ μ•Œκ³ λ¦¬μ¦˜κ³Ό μ•„ν‚€ν…μ²˜

sangjinsuΒ·2025λ…„ 3μ›” 16일

가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ 섀계 기초 4μž₯


πŸ—οΈ 1. κ°œμš”

πŸ”Ή 처리율 μ œν•œ μž₯치(Rate Limiting)λŠ” ν΄λΌμ΄μ–ΈνŠΈ λ˜λŠ” μ„œλΉ„μŠ€κ°€ λ³΄λ‚΄λŠ” νŠΈλž˜ν”½μ„ μ œμ–΄ν•˜λŠ” μž₯μΉ˜λ‹€.
πŸ”Ή API μš”μ²­ νšŸμˆ˜κ°€ μ„€μ •λœ μž„κ³„μΉ˜λ₯Ό μ΄ˆκ³Όν•˜λ©΄ μΆ”κ°€ μš”μ²­μ΄ κ±°λΆ€λœλ‹€.

πŸ“Œ μ£Όμš” λͺ©μ 
βœ… DoS(μ„œλΉ„μŠ€ κ±°λΆ€) 곡격 λ°©μ§€ – μ•…μ˜μ μΈ νŠΈλž˜ν”½μ΄ μ„œλ²„ μžμ›μ„ μ†Œλͺ¨ν•˜μ§€ μ•Šλ„λ‘ λ§‰μŒ.
βœ… λΉ„μš© 절감 – μ„œλ²„ μžμ›μ„ λ‚­λΉ„ν•˜μ§€ μ•Šκ³ , μš°μ„ μˆœμœ„κ°€ 높은 API에 더 λ§Žμ€ μžμ›μ„ λ°°μ • κ°€λŠ₯.
βœ… μ„œλ²„ κ³ΌλΆ€ν•˜ λ°©μ§€ – 봇 νŠΈλž˜ν”½ 및 잘λͺ»λœ μ‚¬μš©μž μš”μ²­μ„ ν•„ν„°λ§ν•˜μ—¬ μ„±λŠ₯ μœ μ§€.


βš™οΈ 2. 섀계 μ‹œ κ³ λ € 사항

πŸ“ (1) μ œν•œ μž₯치 배치 – 어디에 λ‘˜ 것인가?

  • πŸ”Ή μ„œλ²„ μΈ‘ 배치 β†’ API μ„œλ²„μ—μ„œ 직접 처리율 μ œν•œμ„ μˆ˜ν–‰.
    • βœ”οΈ μš”μ²­ 처리의 μœ μ—°μ„±μ΄ λ†’μŒ.
    • ❌ κ°œλ³„ μ„œλ²„ λΆ€ν•˜ 증가.
  • πŸ”Ή κ²Œμ΄νŠΈμ›¨μ΄ 배치 β†’ API Gateway(Nginx, Kong λ“±)μ—μ„œ 처리.
    • βœ”οΈ μ „λ°˜μ μΈ νŠΈλž˜ν”½ 관리 용이.
    • ❌ νŠΉμ • μ•Œκ³ λ¦¬μ¦˜ 선택에 μ œν•œμ΄ μžˆμ„ 수 있음.

⚠️ 정닡은 μ—†μŒ!
β†’ ν˜„μž¬ μ‚¬μš©ν•˜λŠ” 기술 μŠ€νƒ, μ—”μ§€λ‹ˆμ–΄λ§ λ¦¬μ†ŒμŠ€, λΉ„μ¦ˆλ‹ˆμŠ€ λͺ©ν‘œμ— 따라 κ²°μ •ν•΄μ•Ό 함.


πŸ“ (2) 섀계 μ§€μΉ¨

πŸ“Œ 효율적인 처리율 μ œν•œμ„ μœ„ν•΄ κ³ λ €ν•  사항
βœ… 기술 μŠ€νƒ 점검 – ν˜„μž¬ μ‚¬μš©ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄ 및 μΊμ‹œ μ‹œμŠ€ν…œ(예: Redis)과의 ν˜Έν™˜μ„± 확인.
βœ… μ μ ˆν•œ μ•Œκ³ λ¦¬μ¦˜ 선택 – μ„œλ²„ vs. κ²Œμ΄νŠΈμ›¨μ΄ λ°°μΉ˜μ— 따라 μ‚¬μš© κ°€λŠ₯ν•œ μ•Œκ³ λ¦¬μ¦˜μ΄ λ‹¬λΌμ§ˆ 수 있음.
βœ… API Gateway ν™œμš© μ—¬λΆ€ – 이미 κ²Œμ΄νŠΈμ›¨μ΄λ₯Ό μ‚¬μš© 쀑이라면 처리율 μ œν•œ κΈ°λŠ₯을 ν¬ν•¨ν•˜λŠ” 것이 합리적.
βœ… 직접 κ΅¬ν˜„ vs. Managed API μ‚¬μš© – 자체 κ΅¬ν˜„μ΄ μ–΄λ €μš°λ©΄ ν΄λΌμš°λ“œ API(예: AWS API Gateway의 Rate Limiting)λ₯Ό ν™œμš©ν•˜λŠ” 것도 방법.


πŸ”„ 3. 처리율 μ œν•œ μ•Œκ³ λ¦¬μ¦˜

πŸ“Œ λ‹€μ–‘ν•œ μ•Œκ³ λ¦¬μ¦˜μ΄ 있으며, 각각 μž₯단점이 μ‘΄μž¬ν•¨

🎯 (1) 토큰 버킷 (Token Bucket)

πŸͺ£ μ„€λͺ…

  • 일정 κ°„κ²©μœΌλ‘œ 토큰이 버킷에 μΆ”κ°€λ˜λ©°, μš”μ²­μ΄ 올 λ•Œλ§ˆλ‹€ 토큰을 μ†ŒλΉ„ν•˜λŠ” 방식.
  • 토큰이 λΆ€μ‘±ν•˜λ©΄ μš”μ²­μ΄ 거뢀됨.

βœ… μž₯점
βœ”οΈ κ°„λ‹¨ν•˜κ³  κ΅¬ν˜„μ΄ 쉬움.
βœ”οΈ λ²„μŠ€νŠΈ νŠΈλž˜ν”½ 처리 κ°€λŠ₯ – μš”μ²­μ΄ λͺ°λ €λ„ 미리 μ €μž₯된 토큰이 있으면 처리 κ°€λŠ₯.

❌ 단점
⚠️ 버킷 크기와 토큰 곡급λ₯  쑰정이 μ–΄λ ΅λ‹€ – νŠΈλž˜ν”½ νŒ¨ν„΄μ— 따라 졜적의 κ°’ 섀정이 μ€‘μš”ν•¨.


πŸ“¦ (2) λˆ„μΆœ 버킷 (Leaky Bucket)

🚰 μ„€λͺ…

  • FIFO(μ„ μž…μ„ μΆœ) 큐λ₯Ό ν™œμš©ν•΄ μΌμ •ν•œ μ†λ„λ‘œ μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” 방식.
  • 큐가 가득 μ°¨λ©΄ μƒˆλ‘œμš΄ μš”μ²­μ€ 거뢀됨.

βœ… μž₯점
βœ”οΈ λ©”λͺ¨λ¦¬ 효율적.
βœ”οΈ μΌμ •ν•œ μ†λ„λ‘œ μš”μ²­μ„ μ²˜λ¦¬ν•΄ μ„œλ²„ λΆ€ν•˜κ°€ κΈ‰κ²©νžˆ μ¦κ°€ν•˜μ§€ μ•ŠμŒ.

❌ 단점
⚠️ νŠΈλž˜ν”½ 급증 μ‹œ μ΅œμ‹  μš”μ²­μ΄ 손싀될 κ°€λŠ₯μ„± 있음 – 였래된 μš”μ²­μ΄ 큐에 μŒ“μ—¬μ„œ μ΅œμ‹  μš”μ²­μ΄ μ²˜λ¦¬λ˜μ§€ λͺ»ν•  μˆ˜λ„ 있음.


πŸ“Š (3) κ³ μ • μœˆλ„ μΉ΄μš΄ν„° (Fixed Window Counter)

πŸ“† μ„€λͺ…

  • μ‹œκ°„μ„ 일정 간격(Window)으둜 λ‚˜λˆ„κ³  μΉ΄μš΄ν„°λ₯Ό μ¦κ°€μ‹œν‚€λŠ” 방식.
  • μΉ΄μš΄ν„°κ°€ μ„€μ •λœ μž„κ³„μΉ˜λ₯Ό μ΄ˆκ³Όν•˜λ©΄ ν•΄λ‹Ή μœˆλ„μš° λ‚΄μ—μ„œ μΆ”κ°€ μš”μ²­μ΄ 거뢀됨.

βœ… μž₯점
βœ”οΈ κ°„λ‹¨ν•˜κ³  λ©”λͺ¨λ¦¬ 효율적.
βœ”οΈ νŠΉμ • νŠΈλž˜ν”½ νŒ¨ν„΄μ„ μ²˜λ¦¬ν•˜κΈ°μ— 적합.

❌ 단점
⚠️ μœˆλ„μš° κ²½κ³„μ—μ„œ νŠΈλž˜ν”½μ΄ λͺ°λ¦΄ 경우 μž„κ³„μΉ˜λ₯Ό μ΄ˆκ³Όν•  수 있음 – μˆœκ°„μ μΈ λΆ€ν•˜λ₯Ό ν—ˆμš©ν•  수 있음.


πŸ“ (4) 이동 μœˆλ„ λ‘œκΉ… (Sliding Window Logging)

πŸ“œ μ„€λͺ…

  • μš”μ²­ νƒ€μž„μŠ€νƒ¬ν”„λ₯Ό μ €μž₯ν•˜κ³  μ΅œμ‹  μš”μ²­μ΄ λ“€μ–΄μ˜¬ λ•Œλ§ˆλ‹€ 만료된 νƒ€μž„μŠ€νƒ¬ν”„λ₯Ό μ œκ±°ν•˜λŠ” 방식.

βœ… μž₯점
βœ”οΈ μ •κ΅ν•œ νŠΈλž˜ν”½ μ œμ–΄ κ°€λŠ₯ – μ–΄λŠ μˆœκ°„μ„ κΈ°μ€€μœΌλ‘œ 보더라도 μ •ν™•ν•œ μ œν•œμ„ μ μš©ν•  수 있음.

❌ 단점
⚠️ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ 증가 – λͺ¨λ“  μš”μ²­μ˜ νƒ€μž„μŠ€νƒ¬ν”„λ₯Ό μ €μž₯ν•΄μ•Ό ν•˜λ―€λ‘œ λΆ€ν•˜κ°€ 증가할 수 있음.


πŸ”„ (5) μŠ¬λΌμ΄λ”© μœˆλ„ μΉ΄μš΄ν„° (Sliding Window Counter)

πŸ“ˆ μ„€λͺ…

  • κ³ μ • μœˆλ„ μΉ΄μš΄ν„°μ™€ 이동 μœˆλ„ λ‘œκΉ…μ˜ μ ˆμΆ©μ•ˆ
  • ν˜„μž¬ 1λΆ„κ°„μ˜ μš”μ²­ 수 + 직전 1λΆ„κ°„μ˜ μš”μ²­ 수 * 이동 window 와 직전 1뢄이 κ²ΉμΉ˜λŠ” λΉ„μœ¨μ„ 적용.

βœ… μž₯점
βœ”οΈ νŠΈλž˜ν”½ 급증에도 효과적으둜 λŒ€μ‘.
βœ”οΈ λ©”λͺ¨λ¦¬ 효율이 μ’‹μŒ.

❌ 단점
⚠️ νŠΈλž˜ν”½ νŒ¨ν„΄μ΄ κ· λ“±ν•˜κ²Œ λΆ„ν¬λœλ‹€κ³  가정함 – μ‹€μ œ νŠΈλž˜ν”½ ν™˜κ²½μ—μ„œλŠ” λΆ€μ •ν™•ν•  수 있음.


πŸ›οΈ 4. 처리율 μ œν•œ μ•„ν‚€ν…μ²˜

πŸ“Œ 일반적인 처리 κ³Όμ •
1️⃣ ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­μ„ 보냄.
2️⃣ 처리율 μ œν•œ 미듀웨어가 μš”μ²­μ„ κ°€λ‘œμ±„μ„œ Redisμ—μ„œ μΉ΄μš΄ν„° 값을 확인.

  • 🚫 μž„κ³„μΉ˜λ₯Ό μ΄ˆκ³Όν•œ 경우 β†’ 429 Too Many Requests 응닡 λ°˜ν™˜.
  • βœ… μž„κ³„μΉ˜ μ΄ν•˜μΌ 경우 β†’ API μ„œλ²„λ‘œ μš”μ²­ 전달 ν›„ μΉ΄μš΄ν„° κ°’ 증가.

πŸ“Œ 쀑앙 μ§‘μ€‘ν˜• 데이터 μ €μž₯μ†Œ μ‚¬μš©

  • λ°μ΄ν„°λ² μ΄μŠ€(DB)λŠ” λ””μŠ€ν¬ 접근이 느렀 λΉ„νš¨μœ¨μ μ΄λ―€λ‘œ ❌
  • Redis, Memcached 같은 λ©”λͺ¨λ¦¬ 기반 μΊμ‹œλ₯Ό ν™œμš©ν•˜λŠ” 것이 일반적 βœ…

🏒 5. λΆ„μ‚° ν™˜κ²½μ—μ„œμ˜ 처리율 μ œν•œ

πŸ“Œ πŸ’₯ 문제 1: 경쟁 쑰건

  • 닀쀑 μ„œλ²„μ—μ„œ λ™μΌν•œ μΉ΄μš΄ν„°λ₯Ό μ‘°μž‘ν•  경우 경쟁 쑰건 λ°œμƒ κ°€λŠ₯.
  • πŸ”Ή ν•΄κ²°μ±…: Redis Lua 슀크립트 λ˜λŠ” μ •λ ¬ μ§‘ν•©(Sorted Set) ν™œμš©

πŸ“Œ πŸ”„ 문제 2: 동기화 이슈

  • μ—¬λŸ¬ λŒ€μ˜ 처리율 μ œν•œ μ„œλ²„λ₯Ό μ‚¬μš©ν•  경우 일관성 μœ μ§€ ν•„μš”.
  • πŸ”Ή ν•΄κ²°μ±…: Redis 같은 쀑앙 μ§‘μ€‘ν˜• μΊμ‹œ μ‚¬μš©

🎯 6. μΆ”κ°€ λ…Όμ˜

πŸ“Œ Hard vs. Soft 처리율 μ œν•œ

  • 🚧 Hard μ œν•œ: μž„κ³„μΉ˜λ₯Ό μ ˆλŒ€ μ΄ˆκ³Όν•  수 μ—†μŒ.
  • 🌊 Soft μ œν•œ: μΌμ‹œμ μΈ 초과λ₯Ό ν—ˆμš©ν•  수 있음.

πŸ“Œ 처리율 μ œν•œ νšŒν”Ό 방법
βœ… ν΄λΌμ΄μ–ΈνŠΈ 캐싱 ν™œμš©ν•΄ API 호좜 횟수 κ°μ†Œ.
βœ… λ°±μ˜€ν”„(μž¬μ‹œλ„) 둜직 κ΅¬ν˜„ μ‹œ μΆ©λΆ„ν•œ λŒ€κΈ° μ‹œκ°„ 적용.


βœ… 7. κ²°λ‘ 

πŸš€ 처리율 μ œν•œ μž₯μΉ˜λŠ” μ„œλ²„ 보호, λΉ„μš© 절감, νŠΈλž˜ν”½ 관리 μΈ‘λ©΄μ—μ„œ ν•„μˆ˜μ μΈ κΈ°λŠ₯!
πŸ”Ή μš”κ΅¬μ‚¬ν•­ 및 기술 μŠ€νƒμ— 따라 μ μ ˆν•œ μ•Œκ³ λ¦¬μ¦˜κ³Ό κ΅¬ν˜„ 방식을 선택해야 ν•œλ‹€.
πŸ”Ή Redis 같은 λΉ λ₯Έ μΊμ‹œ μ‹œμŠ€ν…œμ„ ν™œμš©ν•˜μ—¬ 효율적인 νŠΈλž˜ν”½ μ œμ–΄ κ°€λŠ₯!



πŸ“Œ Redis Sorted Set(ZSET)κ³Ό 경쟁 쑰건 ν•΄κ²° μ „λž΅ 정리


πŸ”Ή 1. Redis Sorted Set(ZSET)의 κ°œλ…

  • 점수(Score)λ₯Ό κΈ°μ€€μœΌλ‘œ μžλ™ μ •λ ¬λ˜λŠ” μ§‘ν•©(Set)
  • μ£Όμš” μ—°μ‚°
    • ZADD: 데이터 μΆ”κ°€
    • ZINCRBY: 점수 증가 (μ›μžμ  μ—°μ‚°)
    • ZRANGE: 점수 순 μ •λ ¬λœ 데이터 쑰회
    • ZREVRANGE: 점수 λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬
    • ZREM: νŠΉμ • 멀버 μ‚­μ œ
    • ZSCORE: νŠΉμ • 멀버 점수 쑰회
  • μ‚¬μš© 사둀
    • κ²Œμž„ λ¦¬λ”λ³΄λ“œ(Leaderboard)
    • μš°μ„ μˆœμœ„ 큐(Priority Queue)
    • νƒ€μž„μŠ€νƒ¬ν”„ 기반 데이터 μ •λ ¬

πŸ”Ή 2. Redisμ—μ„œ 경쟁 쑰건 ν•΄κ²° 방법

βœ… (1) μ‹±κΈ€ μŠ€λ ˆλ“œ λͺ¨λΈ (Single-threaded Execution)

  • RedisλŠ” 기본적으둜 단일 μŠ€λ ˆλ“œλ‘œ λ™μž‘
  • ν•˜λ‚˜μ˜ λͺ…령이 μ‹€ν–‰λ˜λŠ” λ™μ•ˆ λ‹€λ₯Έ λͺ…령이 κ°œμž…ν•  수 μ—†μŒ β†’ 경쟁 쑰건이 기본적으둜 방지됨

πŸ“Œ 적용 λŒ€μƒ: 단일 Redis μΈμŠ€ν„΄μŠ€ ν™˜κ²½


βœ… (2) μ›μžμ  μ—°μ‚° (Atomic Operations)

  • ZADD, ZINCRBY λ“±μ˜ 연산은 μ›μžμ μœΌλ‘œ 싀행됨
  • λ”°λΌμ„œ λ™μ‹œμ— μ—¬λŸ¬ ν΄λΌμ΄μ–ΈνŠΈκ°€ 접근해도 데이터 좩돌 없이 μ•ˆμ „ν•˜κ²Œ μ—…λ°μ΄νŠΈ κ°€λŠ₯

πŸ“Œ 적용 λŒ€μƒ: 기본적인 데이터 μΆ”κ°€/μˆ˜μ •


βœ… (3) WATCH + MULTI/EXEC을 ν™œμš©ν•œ 낙관적 락 (Optimistic Locking)

  • WATCH λͺ…λ Ήμ–΄λ‘œ νŠΉμ • ν‚€λ₯Ό κ°μ‹œ β†’ 값이 λ³€κ²½λ˜λ©΄ νŠΈλžœμž­μ…˜ μ·¨μ†Œ
  • MULTI/EXEC을 μ‚¬μš©ν•˜μ—¬ μ›μžμ  νŠΈλžœμž­μ…˜ μ‹€ν–‰

πŸ“Œ 적용 λŒ€μƒ: 경쟁 쑰건이 λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” 경우 (예: λ™μΌν•œ 킀에 λŒ€ν•œ μ—¬λŸ¬ ν΄λΌμ΄μ–ΈνŠΈμ˜ λ™μ‹œ μ ‘κ·Ό)

πŸ“Œ 예제 (점수 μ—…λ°μ΄νŠΈ)

WATCH leaderboard
MULTI
ZINCRBY leaderboard 20 "Alice"
EXEC  # λ‹€λ₯Έ ν΄λΌμ΄μ–ΈνŠΈκ°€ λ³€κ²½ν•˜μ§€ μ•Šμ•˜μ„ 경우 싀행됨

βœ… (4) Lua 슀크립트 ν™œμš© (EVAL, EVALSHA)

  • Redis의 Lua μŠ€ν¬λ¦½νŠΈλŠ” λͺ¨λ“  연산을 ν•˜λ‚˜μ˜ μ›μžμ  λΈ”λ‘μœΌλ‘œ μ‹€ν–‰
  • λ³΅μž‘ν•œ 연산을 λ™μ‹œμ— 싀행해도 경쟁 쑰건을 λ°©μ§€ν•  수 있음

πŸ“Œ 적용 λŒ€μƒ: μ—¬λŸ¬ 개의 연산을 μ›μžμ μœΌλ‘œ μ²˜λ¦¬ν•΄μ•Ό ν•  λ•Œ

πŸ“Œ 예제 (점수 증가 μ›μžμ  μ‹€ν–‰)

local key = KEYS[1]
local member = ARGV[1]
local increment = tonumber(ARGV[2])

local currentScore = redis.call("ZSCORE", key, member)
if currentScore then
    return redis.call("ZADD", key, currentScore + increment, member)
else
    return redis.call("ZADD", key, increment, member)
end

βœ… (5) RedLock (λΆ„μ‚° 락) ν™œμš©

  • Redis ν΄λŸ¬μŠ€ν„° ν™˜κ²½μ—μ„œ 동기화 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 락 μ•Œκ³ λ¦¬μ¦˜
  • μ—¬λŸ¬ Redis μΈμŠ€ν„΄μŠ€μ—μ„œ λ™μ‹œμ— 락을 νšλ“ν•˜κ³ , 과반수 이상이 μŠΉμΈν•΄μ•Ό μœ νš¨ν•œ 락으둜 κ°„μ£Ό
  • 경쟁 쑰건이 λ°œμƒν•  κ°€λŠ₯성이 높은 경우 ν™œμš©

πŸ“Œ 적용 λŒ€μƒ: μ—¬λŸ¬ Redis λ…Έλ“œμ—μ„œ λ™μ‹œ μ ‘κ·Ό λ°©μ§€

πŸ“Œ 예제 (Python Redis-pyμ—μ„œ RedLock μ‚¬μš©)

from redis import Redis
from redis_lock import Lock

redis_client = Redis()
lock = Lock(redis_client, "leaderboard_lock")

if lock.acquire(blocking=True, timeout=5):
    try:
        redis_client.zincrby("leaderboard", 10, "Alice")
    finally:
        lock.release()

πŸ”₯ 정리: 경쟁 쑰건 ν•΄κ²° 방법 비ꡐ

μ „λž΅μ„€λͺ…μ μš© λŒ€μƒμž₯점단점
μ‹±κΈ€ μŠ€λ ˆλ“œ λͺ¨λΈκΈ°λ³Έμ μœΌλ‘œ λ™μ‹œ μ‹€ν–‰ 방지단일 μΈμŠ€ν„΄μŠ€ ν™˜κ²½κ°„λ‹¨ν•˜κ³  μ•ˆμ •μ ν™•μž₯μ„± μ œν•œ
μ›μžμ  μ—°μ‚°ZADD, ZINCRBYλŠ” μ›μžμ μœΌλ‘œ μ‹€ν–‰κΈ°λ³Έ 데이터 μΆ”κ°€/μˆ˜μ •λΉ λ¦„μ œν•œμ μΈ μ—°μ‚°
WATCH + MULTI/EXEC낙관적 락을 ν™œμš©ν•˜μ—¬ 좩돌 λ°©μ§€μΆ©λŒ κ°€λŠ₯성이 높은 데이터 μˆ˜μ •λ™μ‹œμ„± 보μž₯좩돌 μ‹œ μž¬μ‹œλ„ ν•„μš”
Lua μŠ€ν¬λ¦½νŠΈλ³΅μž‘ν•œ 연산을 μ›μžμ μœΌλ‘œ μ²˜λ¦¬λ³΅μž‘ν•œ νŠΈλžœμž­μ…˜μ›μžμ„± 보μž₯μœ μ§€λ³΄μˆ˜ 어렀움
RedLockλΆ„μ‚° ν™˜κ²½μ—μ„œ 동기화 보μž₯Redis ν΄λŸ¬μŠ€ν„° ν™˜κ²½κ°•λ ₯ν•œ 동기화성λŠ₯ μ˜€λ²„ν—€λ“œ

🎯 결둠

  1. 단일 μΈμŠ€ν„΄μŠ€ ν™˜κ²½: 기본적으둜 RedisλŠ” μ‹±κΈ€ μŠ€λ ˆλ“œ λͺ¨λΈκ³Ό μ›μžμ  μ—°μ‚° 덕뢄에 경쟁 쑰건이 크게 λ°œμƒν•˜μ§€ μ•ŠμŒ.
  2. 데이터 좩돌이 우렀될 λ•Œ: WATCH + MULTI/EXECλ₯Ό μ‚¬μš©ν•˜μ—¬ 낙관적 락 적용 κ°€λŠ₯.
  3. μ—¬λŸ¬ 개의 λͺ…령을 μ›μžμ μœΌλ‘œ μ‹€ν–‰ν•  λ•Œ: Lua 슀크립트 ν™œμš©.
  4. λΆ„μ‚° ν™˜κ²½(ν΄λŸ¬μŠ€ν„°)μ—μ„œ 동기화 ν•„μš”ν•  λ•Œ: RedLock을 μ‚¬μš©ν•˜μ—¬ 락 적용.

πŸš€ Redis의 Sorted Set(ZSET)은 기본적으둜 경쟁 쑰건을 λ°©μ§€ν•  수 μžˆμ§€λ§Œ, ν™•μž₯μ„±μ΄λ‚˜ 데이터 동기화가 μ€‘μš”ν•œ 경우 μœ„μ˜ μ „λž΅μ„ 적절히 μ‘°ν•©ν•΄μ•Ό ν•œλ‹€!

profile
κ°œλ°œμ— 집쀑할 수 μžˆλŠ”, 이슈λ₯Ό μ€„μ΄λŠ” ν™˜κ²½μ„ λ§Œλ“€κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

0개의 λŒ“κΈ€