Web/Spring

[λ™μ‹œμ„±] Java, Database, Redis, Kafka 방식 μ„±λŠ₯ 비ꡐ

Aaron 2024. 8. 25. 22:05
λ°˜μ‘ν˜•

πŸ“Š λ™μ‹œμ„± μ œμ–΄ 방식 비ꡐ

Series

Java Concurrency Control

Database Concurrency Control

Redis Concurrency Control

Kafka Concurrency Control

Compare Concurrency Control

⚠️

λ‘œμ»¬μ—μ„œ ν…ŒμŠ€νŠΈν•œ 결과이고,

μ„œλ²„ ν™˜κ²½κ³Ό μ—¬λŸ¬ μš”μΈλ“€μ— μ˜ν•΄ κ²°κ³Όκ°€ λ‹¬λΌμ§ˆ 수 있고, μ •ν™•ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

Case 01

ν•œμ •μˆ˜λŸ‰ : 50,000

  • Total User : 296
  • Processes : 8
  • Threads : 37

(DB Named 방식은 μ œμ™Έ)

Result


.

μ‹œκ°„ 내에 λͺ¨λ“  νŠΈλž˜ν”½μ„ μ„±κ³΅μ μœΌλ‘œ μ²˜λ¦¬ν•œ 방식

  • DB Pessimistic
  • Redis Incr
  • Kafka + Redis


.

일뢀 성곡을 ν•˜κΈ΄ ν•˜μ˜€μ§€λ§Œ, νŠΈλž˜ν”½μ„ 버티지 λͺ»ν•˜κ³  μ„±λŠ₯ λ¬Έμ œκ°€ λ°œμƒν•œ 방식 (μ„±λŠ₯ λ¬Έμ œκ°€ λ°œμƒν•œ 개인적인 생각도 λ‹΄μ•„λ³΄μ•˜λ‹€.)

  • DB Optimistic β†’ 좩돌 처리 λΉ„μš© (좩돌 μ‹œ ν•΄λ‹Ή νŠΈλžœμž­μ…˜ μž¬μ‹œλ„) 으둜 μΈν•œ μ„±λŠ₯ μ €ν•˜
  • DB Named β†’ 컀λ„₯μ…˜ ν’€ λΆ€μ‘±μœΌλ‘œ μΈν•œ DeadLock λ°œμƒ 및 μ„±λŠ₯ μ €ν•˜
  • Redis Lettuce β†’ Spin Lock 방식 (반볡적으둜 ν™•μΈν•˜λ©΄μ„œ 락 νšλ“μ„ μ‹œλ„) 으둜 μΈν•œ CPU λΆ€ν•˜
  • Redis Redisson β†’ λ‚΄λΆ€μ μœΌλ‘œ κ΅¬ν˜„λœ μž¬μ‹œλ„ 둜직 (νŠΉμ • κ°„κ²©μœΌλ‘œ μž¬μ‹œλ„) μ—μ„œ λ°œμƒν•˜λŠ” λΆ€ν•˜


.

둜컬 PCμ—μ„œ 버틸 수 μžˆλŠ” νŠΈλž˜ν”½μ΄ μ•„λ‹ˆλΌμ„œ κ²°κ³Όκ°€ ν˜„μ‹€κ³ΌλŠ” λ‹€λ₯Ό μˆ˜λ„ μžˆμ§€λ§Œ,

처음 κ²°κ³Όλ₯Ό λ³΄μ•˜μ„ λ•Œ λΉ λ₯Έ μ„±λŠ₯을 μžλž‘ν•˜λŠ” Redis 의 Lettuce, Redisson 방식이 μ„±λŠ₯ μ €ν•˜ μ΄μŠˆκ°€ μžˆμ„ 쀄을 λͺ°λžλ‹€.

락 νšλ“μ„ μœ„ν•œ μž¬μ‹œλ„ 둜직으둜 μΈν•΄μ„œ λ°œμƒν•˜λŠ” μ„±λŠ₯ μ €ν•˜μΌ μˆ˜λ„ μžˆμ„ κ²ƒμ΄λΌλŠ” 생각이 λ“ λ‹€.

Case 02

ν•œμ •μˆ˜λŸ‰ : 1,000

  • Total User : 99
  • Processes : 3
  • Threads : 33

Result


.

μ‹œκ°„ 내에 λͺ¨λ“  νŠΈλž˜ν”½μ„ μ„±κ³΅μ μœΌλ‘œ μ²˜λ¦¬ν•œ 방식

  • DB Pessimistic
  • DB Optimistic
  • Redis Incr
  • Redis Lettuce
  • Redis Redisson
  • Kafka + Redis


.

일뢀 성곡을 ν•˜κΈ΄ ν•˜μ˜€μ§€λ§Œ, νŠΈλž˜ν”½μ„ 버티지 λͺ»ν•˜κ³  μ„±λŠ₯ λ¬Έμ œκ°€ λ°œμƒν•œ 방식

  • DB Named β†’ 컀λ„₯μ…˜ ν’€ λΆ€μ‘±μœΌλ‘œ μΈν•œ DeadLock λ°œμƒ 및 μ„±λŠ₯ μ €ν•˜


.

ν•œμ •μˆ˜λŸ‰μ΄ 50,000 건일 κ²½μš°μ— λΉ„ν•΄ λŒ€λΆ€λΆ„μ˜ 방식이 μ„±κ³΅μ μœΌλ‘œ λͺ¨λ“  νŠΈλž˜ν”½μ„ μ²˜λ¦¬ν•œ 것을 λ³Ό 수 μžˆλ‹€.

μœ„ 결과듀을 톡해 μ§€κ·Ήνžˆ 개인적인 μƒκ°μœΌλ‘œ 각 방식에 λŒ€ν•œ 결둠을 내보렀고 ν•œλ‹€.

Compare

Java

  • Java Async
    • λ™μ‹œμ„± 이슈 μ‚¬λ‘€μ˜ ν‘œλ³Έ
  • Java Sync
    • μ„œλ²„κ°€ 2λŒ€ 이상일 경우 λ™μ‹œμ„± 이슈 λ°œμƒ

μ‹€λ¬΄μ—μ„œ λ™μ‹œμ„± μ²˜λ¦¬μ— μ ˆλŒ€ μ‚¬μš©ν•  수 μ—†λŠ” 방식.

Database

  • Databse Pessimistic Lock
    • 좩돌이 λΉˆλ²ˆν•˜κ²Œ λ°œμƒν•  수 μžˆλŠ” μƒν™©μ΄κ±°λ‚˜
    • λ°μ΄ν„°λ² μ΄μŠ€μ— λΆ€ν•˜κ°€ 올 μ •λ„μ˜ λ™μ‹œ νŠΈλž˜ν”½μ„ κ²¬λŽŒμ•Ό ν•˜λŠ” 상황이 μ•„λ‹ˆλΌλ©΄ μ ν•©ν•˜λ‹€κ³  생각
  • Databse Optimistic Lock
    • μ λ‹Ήν•œ νŠΈλž˜ν”½μ—μ„œλŠ” μ‚¬μš©ν• λ§Œ ν•˜μ§€λ§Œ,
    • Ramp-Up ν…ŒμŠ€νŠΈλ₯Ό 톡해 μ–Όλ§ˆνΌ 버틸 수 μžˆμ„μ§€ 검증이 ν•„μš”
  • Databse Named Lock
    • 컀λ„₯μ…˜ ν’€ λΆ€μ‘± ν˜„μƒμœΌλ‘œ μ‹€λ¬΄μ—μ„œ μ μš©μ€ μ–΄λ €μ›Œ λ³΄μž„

개인적으둜 λ°μ΄ν„°λ² μ΄μŠ€μ— 락을 μ μš©ν•˜λŠ” 방식은

같은 λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” λ‹€λ₯Έ μ„œλΉ„μŠ€μ— μ„±λŠ₯ 이슈λ₯Ό μ „νŒŒν•  수 μžˆλ‹€κ³  μƒκ°ν•΄μ„œ

λŒ€λŸ‰μ˜ νŠΈλž˜ν”½μ„ κ²¬λŽŒμ•Ό ν•˜λŠ” 상황이라면 Redis, Kafka λ₯Ό ν™œμš©ν•˜κ³ 

μ†ŒλŸ‰μ˜ νŠΈλž˜ν”½λ§Œ κ²¬λŽŒλ„ λ˜λŠ” 상황이라면 Pessimistic Lock 을 μ μš©ν•˜λŠ”κ²Œ μ μ ˆν•˜λ‹€κ³  생각

Redis

  • Redis Incr
    • κ°€μž₯ 쒋은 μ„±λŠ₯을 보유
    • λ©”λͺ¨λ¦¬ 기반이고 μ„œλ²„κ°€ μž¬μ‹œμž‘λ˜κ±°λ‚˜ μž₯μ•  λ°œμƒ μ‹œ 데이터 μœ μ‹€ κ°€λŠ₯성이 μ‘΄μž¬ν•˜λŠ” 단점
  • Redis Lettuce / Redisson
    • μž¬μ‹œλ„ 둜직으둜 μΈν•œ λΆ€ν•˜λ‘œ λŒ€λŸ‰μ˜ νŠΈλž˜ν”½μ—μ„œ 쒋은 μ„±λŠ₯을 λ‚Ό μˆ˜λŠ” 없을 것 κ°™μŒ
    • λΆ„μ‚°λ½μ˜ ν•œκ³„λ„ 쑴재 β†’ λ ˆλ””μŠ€κ°€ μ œκ³΅ν•˜λŠ” 뢄산락(RedLock)의 νŠΉμ§•κ³Ό ν•œκ³„
    • Ramp-Up ν…ŒμŠ€νŠΈλ₯Ό 톡해 μ–Όλ§ˆνΌμ˜ νŠΈλž˜ν”½μ—μ„œ μ„±λŠ₯을 λ‚Ό 수 μžˆμ„μ§€ 검증이 ν•„μš”

Redis Incr 방식은 데이터가 μœ μ‹€λ˜λŠ” 상황에 λŒ€ν•œ λŒ€λΉ„λ§Œ 잘 λ˜μ–΄μžˆλ‹€λ©΄ κ°€μž₯ 쒋은 방식이라고 생각

Kafka

  • Kafka + Redis
    • μž„κ³„κ°’ μ œμ–΄μ™€ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 처리의 역할을 뢄리
    • λΆ€ν•˜κ°€ λΆ„μ‚°λ˜λ―€λ‘œ λŒ€λŸ‰μ˜ νŠΈλž˜ν”½μ— μ ν•©ν•œ 방식이라고 생각

Redis Inc 방식을 ν™œμš©ν•˜μ§€λ§Œ, λŒ€λΆ€λΆ„μ˜ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ€ 처리 μ‹œκ°„μ΄ λ‹€μ†Œ μ†Œμš”λ˜λ‹€ λ³΄λ‹ˆ

μž„κ³„κ°’ μ œμ–΄λŠ” Redisμ—μ„œ μ²˜λ¦¬ν•˜κ³ , λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ€ Kafka Consumerκ°€ μ²˜λ¦¬ν•˜λ©΄μ„œ

λΆ€ν•˜λ₯Ό λΆ„μ‚°μ‹œμΌœ μ„±λŠ₯을 ν–₯μƒμ‹œν‚¬ 수 μžˆλŠ” κ°€μž₯ 쒋은 방법이라고 생각

Reference.

λ°˜μ‘ν˜•