Web/Spring

[λ™μ‹œμ„±] Redis Concurrency Control(incr, Lettuce, Redisson Lock)

Aaron 2024. 8. 18. 22:44
λ°˜μ‘ν˜•

🎯 Redis Concurrency Control

Race Condition

κ²½μŸμƒνƒœλŠ” 두 개 μ΄μƒμ˜ μŠ€λ ˆλ“œκ°€ 곡유 데이터에 μ•‘μ„ΈμŠ€ ν•  수 있고, λ™μ‹œμ— 변경을 ν•˜λ €κ³  ν•  λ•Œ λ°œμƒν•˜λŠ” 문제

  • Race Condition 으둜 λ™μ‹œμ— λ“€μ–΄μ˜€λŠ” μš”μ²­λ“€μ΄ κ°±μ‹  μ „ 값을 읽고, μˆ˜μ •ν•˜λ©΄μ„œ
  • μ‹€μ œ 갱신이 λˆ„λ½λ˜λŠ” ν˜„μƒμ΄ λ°œμƒ

Series

Java Concurrency Control

Database Concurrency Control

Redis Concurrency Control

Kafka Concurrency Control

Compare Concurrency Control

🏹 Redis incr

Redis의 INCR λͺ…령을 μ΄μš©ν•˜μ—¬ νŠΉμ • ν‚€μ˜ 값을 μ›μžμ μœΌλ‘œ μ¦κ°€μ‹œν‚€λ©΄μ„œ
μΉ΄μš΄ν„°λ‚˜ μž„κ³„κ°’ μ œμ–΄ λ“±μ˜ μž‘μ—…μ— μ‚¬μš©ν•˜λŠ” 방법

μ •μ˜.

  • RedisλŠ” λΉ λ₯Έ 속도와 μ‹±κΈ€ μŠ€λ ˆλ“œμ˜ νŠΉμ„±μ„ ν™œμš©ν•˜μ—¬ 레이슀 μ»¨λ””μ…˜μ„ ν•΄κ²°
  • λΉ λ₯Έ μ„±λŠ₯을 가진 INCR λͺ…λ Ή(킀에 λŒ€ν•œ 값을 1μ”© μ¦κ°€μ‹œν‚€λŠ” λͺ…λ Ήμ–΄)을 μ΄μš©ν•˜μ—¬ μž„κ³„κ°’μ„ μ œμ–΄

λ™μž‘ 방식.

  • INCR keyβ†’ 주어진 key의 값을 1 증가
    • ν‚€κ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ„ 경우, λ¨Όμ € ν•΄λ‹Ή ν‚€λ₯Ό 0으둜 μ΄ˆκΈ°ν™”ν•œ ν›„ 1 증가

μž₯점.

  • μ›μžμ  μ—°μ‚°
    • INCR λͺ…λ Ήμ–΄λŠ” Redis의 μ‹±κΈ€ μŠ€λ ˆλ“œ ꡬ쑰 덕뢄에 μ›μžμ μœΌλ‘œ μˆ˜ν–‰
    • μ—¬λŸ¬ ν΄λΌμ΄μ–ΈνŠΈκ°€ λ™μ‹œμ— INCR λͺ…λ Ήμ–΄λ₯Ό 싀행해도 μ€‘λ³΅λ˜κ±°λ‚˜ 잘λͺ»λœ 값이 μ €μž₯λ˜μ§€ μ•ŠμŒ
  • κ°„λ‹¨ν•˜κ³  빠름
    • INCR λͺ…λ Ήμ–΄λŠ” 맀우 κ°„λ‹¨ν•˜κ²Œ μ‚¬μš©ν•  수 있으며, Redis의 λΉ λ₯Έ μ„±λŠ₯ 덕뢄에 μ‹€μ‹œκ°„ μΉ΄μš΄νŒ… μž‘μ—…μ— 맀우 유리
  • λΆ„μ‚° ν™˜κ²½μ—μ„œ μ‚¬μš© κ°€λŠ₯
    • RedisλŠ” λΆ„μ‚° ν™˜κ²½μ—μ„œ μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ—, μ—¬λŸ¬ μ„œλ²„ λ˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μΈμŠ€ν„΄μŠ€μ—μ„œ 쀑앙 집쀑식 μΉ΄μš΄νŒ…μ„ μ‰½κ²Œ κ΅¬ν˜„ κ°€λŠ₯
  • μžλ™ μ΄ˆκΈ°ν™”
    • ν‚€κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우, INCR λͺ…λ Ήμ–΄λŠ” μžλ™μœΌλ‘œ ν‚€λ₯Ό 0으둜 μ΄ˆκΈ°ν™”ν•˜κ³  증가(μ΄ˆκΈ°ν™” μž‘μ—…μ΄ λΆˆν•„μš”)

단점.

  • 데이터 μœ μ‹€ κ°€λŠ₯μ„±
    • RedisλŠ” λ©”λͺ¨λ¦¬ 기반 데이터 μ €μž₯μ†Œμ΄λ―€λ‘œ 지속성 μ˜΅μ…˜μ„ μ„€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ Redis μ„œλ²„κ°€ μž¬μ‹œμž‘λ˜κ±°λ‚˜ μž₯μ• κ°€ λ°œμƒν•  경우 데이터 μœ μ‹€ κ°€λŠ₯μ„± 쑴재
    • μΉ΄μš΄ν„° 값이 μ€‘μš”ν•œ 경우, 데이터 μœ μ‹€μ— λŒ€λΉ„ν•œ 좔가적인 μ‘°μΉ˜κ°€ ν•„μš”
  • μ œμ–΄λœ μž„κ³„κ°’ κ΄€λ¦¬μ˜ 어렀움
    • νŠΉμ • μž„κ³„κ°’μ„ λ„˜μ—ˆμ„ λ•Œ 이λ₯Ό κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” 좔가적인 둜직이 ν•„μš”
  • νŠΈλžœμž­μ…˜ 및 λ³΅μž‘ν•œ 둜직 κ΅¬ν˜„μ˜ 어렀움
    • λ³΅μž‘ν•œ νŠΈλžœμž­μ…˜μ„ λ‹€λ£¨κ±°λ‚˜ μ—¬λŸ¬ λ‹¨κ³„μ˜ 연산이 ν•„μš”ν•œ 경우, INCRλ§ŒμœΌλ‘œλŠ” μ œμ–΄ν•˜κΈ° 어렀움

사둀.

  • API Rate Limiting β†’ API μš”μ²­μ˜ 횟수 μ œν•œ
  • λ™μ‹œμ„± μ œμ–΄ β†’ νŠΉμ • λ¦¬μ†ŒμŠ€λ‚˜ μž‘μ—…μ— λŒ€ν•΄ λ™μ‹œμ— μ ‘κ·Όν•  수 μžˆλŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ 수 μ œν•œ
  • 이벀트 μΉ΄μš΄νŒ… β†’ νŠΉμ • 이벀트 λ°œμƒ 횟수λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ 기둝해야 ν•  경우
    • ex) κ΄‘κ³  클릭 수, μ’‹μ•„μš” 수, νŽ˜μ΄μ§€ λ·° 수 등을 μ‹€μ‹œκ°„μœΌλ‘œ μΉ΄μš΄νŒ…ν•˜μ—¬ 좔적
  • λΆ„μ‚° ν™˜κ²½μ—μ„œμ˜ 쀑앙 집쀑식 μΉ΄μš΄νŒ… β†’ μ—¬λŸ¬ μ„œλ²„λ‚˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μΈμŠ€ν„΄μŠ€μ—μ„œ 곡톡 μΉ΄μš΄ν„°λ₯Ό μœ μ§€ν•  경우

.

redis incr example

.

πŸ› οΈ μ„±λŠ₯ ν…ŒμŠ€νŠΈ.

  • ν•œμ • μˆ˜λŸ‰: 50,000
  • User: 296
  • Processes: 8
  • Threads: 37
  • Duration: 3 min (01:40 쀑단)

κ²°κ³Όλ₯Ό 보면 μ •ν™•ν•˜κ²Œ 50,000 건만 μ„±κ³΅μœΌλ‘œ 처리된 것을 λ³Ό 수 μžˆλ‹€.

Redis key λŠ” 82,720 인데 50,000(Successful) + 32,720(Errors) = 82,720 둜 μ •ν™•ν•˜κ²Œ μ €μž₯λ˜μ—ˆλ‹€.

00:36 μ΄ν›„μ—λŠ” λͺ¨λ“  μˆ˜λŸ‰μ΄ 0으둜 μ‘°νšŒλ˜μ–΄, 재고 λΆ€μ‘± 였λ₯˜κ°€ λ°œμƒν•˜κ²Œ λœλ‹€.

Result

🏹 Redis Lettuce Lock

Redis의 λͺ…령어와 κΈ°λŠ₯을 ν™œμš©ν•˜μ—¬ 락을 κ΅¬ν˜„ν•˜λŠ” 방법
주둜 SET λͺ…령어와 TTL(Time-To-Live)을 μ‚¬μš©ν•˜μ—¬ νŠΉμ • λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ μž κΈˆμ„ 관리

μ •μ˜.

  • Lettuceλ₯Ό μ‚¬μš©ν•΄ Redisμ—μ„œ λΆ„μ‚° 락(Distributed Lock)을 κ΅¬ν˜„ κ°€λŠ₯
  • MySQL의 Named Lockκ³Ό μœ μ‚¬ν•œ 방식
  • setnx(set if not exist) λͺ…λ Ήμ–΄λ₯Ό ν™œμš©ν•˜μ—¬ 뢄산락 κ΅¬ν˜„
  • Spin Lock 방식
    • 락을 νšλ“ν•˜λ €λŠ” μŠ€λ ˆλ“œκ°€ 락을 μ‚¬μš©ν•  수 μžˆλŠ”μ§€ 반볡적으둜 ν™•μΈν•˜λ©΄μ„œ 락 νšλ“μ„ μ‹œλ„ν•˜λŠ” 방식
    • μž¬μ‹œλ„ 둜직 개발 ν•„μš”

λ™μž‘ 방식.

  • 락 νšλ“
    • νŠΉμ • ν‚€λ₯Ό μƒμ„±ν•˜κ³  SET λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ 이 킀에 κ°’κ³Ό TTL을 μ„€μ •
    • μ΄λ•Œ NX(Keyκ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•Œλ§Œ μ„€μ •) μ˜΅μ…˜κ³Ό EX(ν‚€μ˜ 만료 μ‹œκ°„μ„ 초 λ‹¨μœ„λ‘œ μ„€μ •) μ˜΅μ…˜μ„ ν•¨κ»˜ μ‚¬μš©
    • 락을 μ„±κ³΅μ μœΌλ‘œ νšλ“ν•˜λ©΄ OKλ₯Ό λ°˜ν™˜ν•˜κ³ , λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λŠ” 락을 νšλ“ μ‹€νŒ¨
  • 락 ν•΄μ œ
    • μž‘μ—…μ΄ μ™„λ£Œλ˜λ©΄ 락을 ν•΄μ œν•˜κΈ° μœ„ν•΄ ν•΄λ‹Ή ν‚€λ₯Ό μ‚­μ œ
    • 이 κ³Όμ •μ—μ„œ ν‚€κ°€ μ‹€μ œλ‘œ μž κΈˆμ„ νšλ“ν•œ ν”„λ‘œμ„ΈμŠ€μ— μ˜ν•΄ μ‚­μ œλ˜λŠ”μ§€ ν™•μΈν•˜λŠ” 둜직이 ν•„μš”ν•  수 있음
  • μžλ™ ν•΄μ œ
    • TTL을 μ„€μ •ν•΄ 두면 μ§€μ •λœ μ‹œκ°„μ΄ μ§€λ‚˜λ©΄ 락이 μžλ™μœΌλ‘œ ν•΄μ œ
    • ν”„λ‘œμ„ΈμŠ€κ°€ 예기치 μ•Šκ²Œ μ’…λ£Œλ˜λŠ” μƒν™©μ—μ„œλ„ μ‹œμŠ€ν…œμ΄ λ¬΄ν•œμ • λŒ€κΈ°ν•˜λŠ” 것을 방지

μž₯점.

  • κ°„λ‹¨ν•œ κ΅¬ν˜„
    • Redis의 κΈ°λ³Έ λͺ…λ Ήμ–΄λ§ŒμœΌλ‘œ κ°„λ‹¨ν•˜κ²Œ λΆ„μ‚° 락을 κ΅¬ν˜„ κ°€λŠ₯
    • λ³΅μž‘ν•œ μ„€μ •μ΄λ‚˜ μ™ΈλΆ€ 라이브러리 없이도 효율적인 락 λ©”μ»€λ‹ˆμ¦˜μ„ ꡬ좕
    • (spring data redis μ‚¬μš© μ‹œ 기본적으둜 Lettuce 적용)
  • 비동기 처리
    • 비동기 및 λ°˜μ‘ν˜• ν”„λ‘œκ·Έλž˜λ° λͺ¨λΈμ„ 지원
    • 높은 μ„±λŠ₯κ³Ό 비동기 μ²˜λ¦¬κ°€ μš”κ΅¬λ˜λŠ” μ‹œμŠ€ν…œμ—μ„œ 효율적으둜 μž‘λ™
  • TTL을 ν†΅ν•œ μžλ™ ν•΄μ œ
    • TTL 섀정을 톡해 μž κΈˆμ„ μžλ™μœΌλ‘œ ν•΄μ œ
    • 예기치 μ•Šμ€ 였λ₯˜λ‚˜ ν”„λ‘œμ„ΈμŠ€ μ’…λ£Œλ‘œ μΈν•œ 잠금 ν•΄μ œλ₯Ό μ‹ κ²½ μ“Έ ν•„μš”κ°€ μ—†μŒ
  • ν™•μž₯μ„±
    • Lettuce Lock은 Redisλ₯Ό 기반으둜 ν•˜κΈ° λ•Œλ¬Έμ—, λΆ„μ‚° μ‹œμŠ€ν…œμ—μ„œ μ†μ‰½κ²Œ ν™•μž₯ κ°€λŠ₯
    • μ—¬λŸ¬ μΈμŠ€ν„΄μŠ€κ°€ λ™μΌν•œ Redis μ„œλ²„λ₯Ό 톡해 락을 곡유 κ°€λŠ₯

단점.

  • Spin Lock 방식
    • λ™μ‹œμ— λ§Žμ€ μŠ€λ ˆλ“œκ°€ 락 νšλ“ λŒ€κΈ° μƒνƒœλΌλ©΄ λ ˆλ””μŠ€μ— λΆ€ν•˜κ°€ 갈 수 있음
    • 락 νšλ“ μž¬μ‹œλ„ κ°„ λŒ€κΈ° μ‹œκ°„λ„ ν•„μš”
  • λΆ„μ‚° 락의 μ‹ λ’°μ„± 문제
    • RedisλŠ” 기본적으둜 단일 λ…Έλ“œμ—μ„œ μž‘λ™
    • Redis μ„œλ²„μ— μž₯μ• κ°€ λ°œμƒν•˜κ±°λ‚˜ λ„€νŠΈμ›Œν¬ λΆ„ν• (Partitioning)이 μΌμ–΄λ‚˜λ©΄ 락이 ν•΄μ œλ˜μ§€ μ•Šκ±°λ‚˜, 잘λͺ»λœ ν”„λ‘œμ„ΈμŠ€μ— μ˜ν•΄ 락이 ν•΄μ œλ  κ°€λŠ₯성이 쑴재
  • 락 ν•΄μ œ 경쟁 쑰건
    • ν”„λ‘œμ„ΈμŠ€κ°€ 락을 ν•΄μ œν•  λ•Œ, λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€κ°€ λ™μ‹œμ— 같은 킀에 λŒ€ν•΄ 락을 νšλ“ν•˜λ € ν•  경우 Race Condition λ°œμƒ κ°€λŠ₯μ„± 쑴재
    • 방지λ₯Ό μœ„ν•΄ 락 ν•΄μ œ μ‹œ κ³ μœ ν•œ μ‹λ³„μžλ₯Ό ν™•μΈν•˜λŠ” 좔가적인 둜직이 ν•„μš”
  • TTL의 ν•œκ³„
    • TTL이 μ§€λ‚˜λ©΄ μžλ™μœΌλ‘œ 락이 ν•΄μ œλ˜μ§€λ§Œ, μž‘μ—…μ΄ μ˜ˆμƒλ³΄λ‹€ 였래 걸릴 경우 락이 일찍 ν•΄μ œλ  μœ„ν—˜μ΄ 쑴재
    • 이둜 인해 두 ν”„λ‘œμ„ΈμŠ€κ°€ λ™μ‹œμ— 같은 λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•˜κ²Œ 될 수 있음
  • λ„€νŠΈμ›Œν¬ 지연 문제
    • λΆ„μ‚° ν™˜κ²½μ—μ„œ λ„€νŠΈμ›Œν¬ μ§€μ—°μœΌλ‘œ 인해 락이 μ‹œμ˜μ μ ˆν•˜κ²Œ ν•΄μ œλ˜μ§€ μ•Šκ±°λ‚˜, λ°˜λŒ€λ‘œ 이미 ν•΄μ œλœ 락이 아직 ν•΄μ œλ˜μ§€ μ•Šμ€ κ²ƒμœΌλ‘œ 인식될 수 있음 β†’ 잠재적으둜 데이터 일관성 문제λ₯Ό 초래

사둀.

  • λΆ„μ‚° μ‹œμŠ€ν…œμ—μ„œμ˜ λ¦¬μ†ŒμŠ€ 동기화
    • μ—¬λŸ¬ μ„œλ²„λ‚˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μΈμŠ€ν„΄μŠ€μ—μ„œ λ™μΌν•œ λ¦¬μ†ŒμŠ€(ex. 파일, λ°μ΄ν„°λ² μ΄μŠ€ λ ˆμ½”λ“œ)에 μ ‘κ·Όν•  λ•Œ, Lettuce Lock을 μ‚¬μš©ν•˜μ—¬ λ™μ‹œ 접근을 μ œμ–΄
  • μ„œλ²„ κ°„ μž‘μ—… μ‘°μ •
    • λΆ„μ‚° ν™˜κ²½μ—μ„œ μ„œλ²„ κ°„μ˜ μž‘μ—…μ„ μ‘°μ •ν•˜κ±°λ‚˜ νŠΉμ • μž‘μ—…μ„ 단일 μ„œλ²„μ—μ„œλ§Œ μˆ˜ν–‰λ˜λ„λ‘ 보μž₯ν•  λ•Œ 유용
    • ex) 배치 μž‘μ—…μ΄λ‚˜ 크둠 μž‘μ—…μ˜ 쀑볡 싀행을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ μ‚¬μš©
  • API Rate Limiting
    • νŠΉμ • μ‚¬μš©μžκ°€ 일정 κΈ°κ°„ 내에 APIλ₯Ό 일정 횟수 이상 ν˜ΈμΆœν•˜μ§€ λͺ»ν•˜λ„둝 μ œν•œν•  λ•Œ, Redis의 TTL을 ν™œμš©ν•œ Lettuce Lock λ°©μ‹μœΌλ‘œ Rate Limiting을 κ΅¬ν˜„
  • μΌνšŒμ„± μž‘μ—… 보μž₯
    • νŠΉμ • μ΄λ²€νŠΈλ‚˜ μž‘μ—…μ΄ ν•œ 번만 μ‹€ν–‰λ˜μ–΄μ•Ό ν•˜λŠ” 경우, Lettuce Lock을 μ‚¬μš©ν•˜μ—¬ λ™μΌν•œ μ΄λ²€νŠΈκ°€ 쀑볡 μ²˜λ¦¬λ˜μ§€ μ•Šλ„λ‘ μ œν•œ
    • ex) 이메일 λ°œμ†‘, νŠΈλžœμž­μ…˜ 처리 λ“±μ—μ„œ μ‚¬μš©

.

redis lettuce lock example

.

πŸ› οΈ μ„±λŠ₯ ν…ŒμŠ€νŠΈ.

  • ν•œμ • μˆ˜λŸ‰: 50,000
  • User: 296
  • Processes: 8
  • Threads: 37
  • Duration: 3 min

λ™μ‹œμ— λ§Žμ€ μŠ€λ ˆλ“œκ°€ 락 νšλ“ λŒ€κΈ° μƒνƒœμ—μ„œ 반볡적으둜 락 νšλ“ 확인을 ν•˜λ‹€ λ³΄λ‹ˆ

CPU μ‚¬μš©λŸ‰μ΄ 늘게 λ˜μ—ˆλŠ”μ§€ μ„±λŠ₯이 쒋지 μ•Šμ•˜λ‹€.

λ™μΌν•œ 쑰건으둜 31,380 건밖에 처리λ₯Ό λͺ» ν•˜μ˜€λ‹€.

κ·Έλž˜λ„ λ™μ‹œμ„± μ²˜λ¦¬κ°€ 잘 되고 μžˆλŠ”μ§€ 확인은 ν•΄μ•Ό ν•˜λ‹ˆ ν•œμ • μˆ˜λŸ‰μ„ 10,000 으둜 μ€„μ—¬μ„œ 확인을 λ”°λ‘œ ν•΄λ³΄μ•˜λŠ”λ° λ¬Έμ œλŠ” μ—†μ—ˆλ‹€.

Result

🏹 Redis Redisson Lock

pub-sub 기반으둜 Lock κ΅¬ν˜„ 제곡

μ •μ˜.

  • 채널을 λ§Œλ“€κ³  락을 점유 쀑인 μŠ€λ ˆλ“œκ°€ 락 νšλ“μ„ λŒ€κΈ° 쀑인 μŠ€λ ˆλ“œμ—κ²Œ 락 ν•΄μ œλΌλŠ” λ©”μ‹œμ§€λ₯Ό 전솑
    • λ©”μ‹œμ§€λ₯Ό 전달받은 μŠ€λ ˆλ“œκ°€ 락 νšλ“μ„ μ‹œλ„ν•˜λŠ” 방식
  • 락 νšλ“μ„ μœ„ν•΄ 반볡적으둜 락 νšλ“μ„ μ‹œλ„ν•˜λŠ” Lettuce λŒ€λΉ„ λΆ€ν•˜λ₯Ό 쀄일 수 있음

λ™μž‘ 방식.

  • 락 νšλ“
    • ν΄λΌμ΄μ–ΈνŠΈκ°€ lock() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄, Redisson은 Redis에 락을 μ„€μ •ν•˜λŠ” λͺ…λ Ήμ–΄λ₯Ό 전솑
    • μ΄λ•Œ 락의 만료 μ‹œκ°„(TTL)이 μ„€μ •λ˜μ–΄, μ„€μ •λœ μ‹œκ°„μ΄ μ§€λ‚˜λ©΄ 락이 μžλ™μœΌλ‘œ ν•΄μ œ
  • 락 ν•΄μ œ
    • μž‘μ—…μ΄ μ™„λ£Œλ˜λ©΄ unlock() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ 락을 ν•΄μ œ
    • 이 κ³Όμ •μ—μ„œ 락이 μ‹€μ œλ‘œ ν•΄λ‹Ή ν΄λΌμ΄μ–ΈνŠΈμ— μ˜ν•΄ μ„€μ •λœ 것인지 ν™•μΈν•˜μ—¬, λ‹€λ₯Έ ν΄λΌμ΄μ–ΈνŠΈκ°€ 잘λͺ»λœ 락 ν•΄μ œλ₯Ό ν•˜μ§€ μ•Šλ„λ‘ 보호
  • μžλ™ μ—°μž₯
    • Redisson은 락이 μ„€μ •λœ λ™μ•ˆ 주기적으둜 만료 μ‹œκ°„μ„ μ—°μž₯ν•˜λŠ” κΈ°λŠ₯을 제곡
    • μž‘μ—…μ΄ μ˜ˆμƒλ³΄λ‹€ 였래 κ±Έλ¦¬λŠ” κ²½μš°μ—λ„ 락이 μœ μ§€λ˜λ„λ‘ 지원

μž₯점.

  • pub-sub 기반 κ΅¬ν˜„
    • Lettuce Lock λŒ€λΉ„ λ ˆλ””μŠ€μ— 적은 λΆ€ν•˜
    • 락 νšλ“ μž¬μ‹œλ„λ₯Ό 기본적으둜 제곡
  • κ³ κ°€μš©μ„±
    • Redis ν΄λŸ¬μŠ€ν„° ν™˜κ²½μ„ 지원
    • κ³ κ°€μš©μ„±μ„ μœ„ν•΄ μ—¬λŸ¬ λ…Έλ“œμ— λΆ„μ‚°λœ Redis μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš© κ°€λŠ₯
    • 단일 λ…Έλ“œ μž₯μ•  μ‹œμ—λ„ 락이 μ•ˆμ •μ μœΌλ‘œ μœ μ§€
  • μžλ™ μ—°μž₯ κΈ°λŠ₯
    • Watchdog κΈ°λŠ₯을 톡해 락의 만료 μ‹œκ°„μ„ μžλ™μœΌλ‘œ μ—°μž₯
    • κΈ΄ μž‘μ—…μ„ μˆ˜ν–‰ν•  λ•Œ 락이 μ˜λ„μΉ˜ μ•Šκ²Œ ν•΄μ œλ˜λŠ” 것을 방지
  • λ‹€μ–‘ν•œ 락 μœ ν˜• 지원
    • 기본적인 락뿐만 μ•„λ‹ˆλΌ, μž¬μ§„μž… 락(Reentrant Lock), 곡정 락(Fair Lock), 읽기-μ“°κΈ° 락(ReadWrite Lock) λ“± λ‹€μ–‘ν•œ 락 μœ ν˜•μ„ 지원
  • νŽΈλ¦¬ν•œ API
    • κ°„λ‹¨ν•˜κ³  직관적인 APIλ₯Ό μ œκ³΅ν•˜μ—¬, λ³΅μž‘ν•œ λΆ„μ‚° 락 λ‘œμ§μ„ μ‰½κ²Œ κ΅¬ν˜„
  • λΆ„μ‚° 락 관리
    • λΆ„μ‚° 락을 κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ λ‹€μ–‘ν•œ 도ꡬ와 κΈ°λŠ₯을 μ œκ³΅ν•˜μ—¬, λΆ„μ‚° ν™˜κ²½μ—μ„œ λ™μ‹œμ„±μ„ 효과적으둜 μ œμ–΄

단점.

  • λ³΅μž‘μ„±
    • 효과적으둜 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ„€μ •κ³Ό μ‚¬μš©λ²•μ— λŒ€ν•œ κΉŠμ€ 이해가 ν•„μš” + λ³„λ„μ˜ 라이브러리 ν•„μš”
    • 특히 Redis ν΄λŸ¬μŠ€ν„° ν™˜κ²½μ—μ„œμ˜ 섀정은 볡작
  • λ„€νŠΈμ›Œν¬ 지연 및 μž₯μ• 
    • λΆ„μ‚° 락은 λ„€νŠΈμ›Œν¬ μ§€μ—°μ΄λ‚˜ Redis λ…Έλ“œ μž₯μ• λ‘œ 인해 μ„±λŠ₯ μ €ν•˜ λ˜λŠ” 잠금 문제λ₯Ό μΌμœΌν‚¬ 수 있음
    • μ΄λŸ¬ν•œ 문제λ₯Ό μ΅œμ†Œν™”ν•˜κΈ° μœ„ν•΄ μ„€κ³„λ˜μ—ˆμ§€λ§Œ, μ™„μ „νžˆ 방지할 μˆ˜λŠ” μ—†μŒ
  • μ˜€λ²„ν—€λ“œ
    • μžλ™ μ—°μž₯ κΈ°λŠ₯κ³Ό κ³ κ°€μš©μ„± 지원 κΈ°λŠ₯은 좔가적인 μ˜€λ²„ν—€λ“œλ₯Ό λ°œμƒμ‹œν‚¬ 수 있음
    • 맀우 높은 μ„±λŠ₯이 μš”κ΅¬λ˜λŠ” μ‹œμŠ€ν…œμ—μ„œλŠ” 주의 ν•„μš”
  • 데이터 μœ μ‹€ κ°€λŠ₯μ„±
    • λΆ„μ‚° 락의 정보가 Redis의 μž₯μ• λ‚˜ μž¬μ‹œμž‘μœΌλ‘œ 인해 μœ μ‹€λ  κ°€λŠ₯성이 쑴재
    • 이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ 좔가적인 데이터 지속성 섀정이 ν•„μš”

사둀.

  • λΆ„μ‚° νŠΈλžœμž­μ…˜ 관리
    • λΆ„μ‚° μ‹œμŠ€ν…œμ—μ„œ νŠΈλžœμž­μ…˜μ„ μ•ˆμ „ν•˜κ²Œ κ΄€λ¦¬ν•˜λŠ” 데 유용
    • ex) μ—¬λŸ¬ λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€κ°€ λ™μΌν•œ λ°μ΄ν„°λ² μ΄μŠ€λ‚˜ λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•  λ•Œ λ™μ‹œμ„± 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 데 μ‚¬μš©
  • λ™μ‹œ μž‘μ—… μ œν•œ
    • μ—¬λŸ¬ μ„œλ²„μ—μ„œ λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” μž‘μ—…μ˜ 수λ₯Ό μ œν•œν•΄μ•Ό ν•  λ•Œ μ‚¬μš©
    • ex) λΆ„μ‚°λœ μ›Ή μ„œλ²„κ°€ λ™μΌν•œ νŒŒμΌμ„ λ™μ‹œμ— μˆ˜μ •ν•˜μ§€ λͺ»ν•˜κ²Œ ν•˜κ±°λ‚˜, λ™μΌν•œ μ™ΈλΆ€ API에 λŒ€ν•œ λ™μ‹œ μš”μ²­ 수λ₯Ό μ œν•œν•˜λŠ” 데 ν™œμš©
  • μž¬μ§„μž… 락 ν•„μš”μ‹œ
    • λ™μΌν•œ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ 락을 μ—¬λŸ¬ 번 νšλ“ν•˜κ³  ν•΄μ œν•  ν•„μš”κ°€ μžˆλŠ” 경우, Redisson의 μž¬μ§„μž… 락 κΈ°λŠ₯을 톡해 이 μž‘μ—…μ„ μ•ˆμ „ν•˜κ²Œ 처리
  • λ³΅μž‘ν•œ 동기화 둜직
    • 읽기-μ“°κΈ° 락, 곡정 락 λ“± λ³΅μž‘ν•œ 동기화 μš”κ΅¬ 사항이 μžˆλŠ” 경우 μ‹œλ‚˜λ¦¬μ˜€ κ΅¬ν˜„ κ°€λŠ₯

μ‹€λ¬΄μ—μ„œλŠ” 보톡

μž¬μ‹œλ„κ°€ ν•„μš”ν•˜μ§€ μ•Šμ€ 락은 Lettuceλ₯Ό ν™œμš©ν•˜κ³ ,

μž¬μ‹œλ„κ°€ ν•„μš”ν•œ 경우 Redisson을 ν™œμš©

μ°Έκ³ .

.

redis redisson lock example

.

πŸ› οΈ μ„±λŠ₯ ν…ŒμŠ€νŠΈ.

  • ν•œμ • μˆ˜λŸ‰: 50,000
  • User: 296
  • Processes: 8
  • Threads: 37
  • Duration: 3 min

Lettuce 의 Spin Lock 방식 λŒ€ν•œ 단점을 ν•΄κ²°ν•˜κΈ° μœ„ν•œ μ°¨μ„ μ±…μœΌλ‘œ Redisson 이 μ‚¬μš©λ˜λŠ”λ°,

Redisson μ—μ„œλŠ” lua script와 μ„Έλ§ˆν¬μ–΄κ°€ μ‚¬μš©λœ λ‹€κ³€ ν•œλ‹€.

ν™˜κ²½μ— 따라 λ‹€λ₯Ό 수 μžˆμ§€λ§Œ Redisson Lock 방식도 μ„±λŠ₯이 μ’‹μ§€λ§Œμ€ μ•Šμ•˜λ‹€.

λ™μΌν•œ 쑰건으둜 28,816 건밖에 처리λ₯Ό λͺ» ν•˜μ˜€λ‹€. (Lettuce Lock 보닀 더 μ•ˆ 쒋은 μ„±λŠ₯)

κ·Έλž˜λ„ λ™μ‹œμ„± μ²˜λ¦¬κ°€ 잘 되고 μžˆλŠ”μ§€ 확인은 ν•΄μ•Ό ν•˜λ‹ˆ ν•œμ • μˆ˜λŸ‰μ„ 10,000 으둜 μ€„μ—¬μ„œ 확인을 λ”°λ‘œ ν•΄λ³΄μ•˜λŠ”λ° λ¬Έμ œλŠ” μ—†μ—ˆλ‹€.

Result

λ°˜μ‘ν˜•