[TIL] λΆμ°λ½
π λΆμ°λ½ μ΄λ?
λ€μμ μλ²(λλ νλ‘μΈμ€)κ° λμμ κ°μ μμμ μ κ·Όν λ, λ°μν μ μλ λμμ± λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ μ¬μ©λλ λκΈ°ν 맀컀λμ¦. ‘μ€μνλ λ½ κ΄λ¦¬ μμ€ν ' μ μ¬μ©νμ¬ λΆμ°λ νκ²½μμ λ½μ κ±Έκ³ κ΄λ¦¬νλ€.
- λ½ κ΄λ¦¬ : λ§λ£μκ° μ€μ , λ½ κ°±μ , λ½ ν΄μ
- μ₯μ : μλ² λΆμ° νκ²½μμλ νλ‘μΈμ€λ€μ μμμ μ°μ°μ΄ κ°λ₯.
- λ½μ νλν νλ‘μΈμ€ λλ μ€λ λ λ§μ΄ 곡μ μμ(or Critical Section)μ μ κ·Όν μ μλλ‘ νλ κ².
- νΉμ μμμ λν μ κ·Όμ μ μ΄νκΈ° μν΄ λ€νΈμν¬λ₯Ό ν΅ν΄ λ½ μ€μ
π λΆμ°λ½μ ꡬννλ μ¬λ¬κ°μ§ λ°©λ²
- μ νν λ§νμλ©΄, λ½μ κ΄λ¦¬νλ μ€μ κ΄λ¦¬ μμ€ν μ 무μμΌλ‘ ν μ§
1) Zookeeper
λΆμ° μλ² κ΄λ¦¬μμ€ν μΌλ‘ λΆμ° μλΉμ€ λ΄ μ€μ λ±μ 곡μ ν΄μ£Όλ μμ€ν .νμ§λ§ μΆκ°μ μΈ μΈνλΌ κ΅¬μ±μ΄ νμνκ³ μ±λ₯ νλμ μν λ¬λ컀λΈκ° μ‘΄μ¬. νμ¬λ λΆμ°λ½ μ΄μΈμ μ΄μ©ν μ©λκ° μμΌλ―λ‘ μ΄μ©νμ§ μλκ²μ΄ μ’λ€κ³ νλ¨.
2) MySQL
MySQLμ μΆκ°μ μΈ μΈνλΌ κ΅¬μ±μμ΄ λ¬Έμμ΄λ‘ κ±°λ User Level LockμΌλ‘ λΆμ°λ½μ μ§μ ꡬνν μ μλ€. νμ§λ§ μλμ λ¨μ μ΄ μλ€.
- λ½μ μλμΌλ‘ λ°λ©ν μ μμ΄(timeout X) λͺ μμ μΌλ‘ λ½μ release μμΌμΌ νλ€.
- DBμμ λ½μ κ΄λ¦¬νκΈ° λλ¬Έμ DBμ λΆλ΄μ΄ μ¬μ ν μ‘΄μ¬νλ€.
- λ½ νλ μλλ μ€νλ½μΌλ‘ ꡬνν΄μΌνκΈ° λλ¬Έμ WASμλ λΆλ΄μ΄ μ‘΄μ¬νλ€.
3) Redis (μ ν)
Zookeeperμ λ§μ°¬κ°μ§λ‘ λ³λμ μΈνλΌλ₯Ό ꡬμΆνκ³ κ΄λ¦¬ν΄μΌνμ§λ§ μλμ μ₯μ μ΄ μλ€.
- μΈλ©λͺ¨λ¦¬ DBλ‘ μλκ° λΉ λ₯΄λ€.(μ΄λΉ 100,000 QPS μ μλ)
- μ±κΈμ€λ λ λ°©μμΌλ‘ λμμ± λ¬Έμ κ° νμ ν μ λ€.
- μΊμ μ μ₯μλ‘ νμ©μ΄ κ°λ₯νλ€.(λ€μν μλ£κ΅¬μ‘° μ§μ)
π λΆμ°λ½ ꡬν λ°©μμΌλ‘ λ λμ€λ₯Ό μ νν μ΄μ
β μ§κΈκΉμ§μ λ¬Έμ & μμΌλ‘μ λͺ©ν
π λ¬Έμ
[ κ²°μ μν μ¬κ³ κ΄λ¦¬]
⇒ λΉκ΄μ λ½μ μ΄μ©ν΄ ꡬννμλ€.
- DB μ체μ λ½μ κ±°λ λ°©μμ΄λΌ μλ΅μκ°μ΄ λμ 200건 μ²λ¦¬μ 6μ΄λ‘ λ¦μ΄μ§.
- λμ μμ² κ±΄μλ₯Ό λ리면, timeoutμΌλ‘ μ€ν¨νλ μμ²μ΄ λ§μμ§
- DB μ±λ₯μ λ°λΌ, λ¨μΌ λ³λͺ©μ§μ μ΄ λμ΄λ²λ¦΄ μ μλ€.
- νΈλμμ μ΄ μ μμ μΌλ‘ μ’ λ£λμ§ μμΌλ©΄, DBμ Lockμ΄ κ±Έλ¦° μνλ‘ λ¨μμμ΄ λ°λλ½μ μνμ±μ΄ μμλ€. (μ΄κ±΄ DBMSκ° νΈλμμ timeoutμΌλ‘ μ²λ¦¬ν¨)
[ λκΈ°μ΄ μλ² μ²λ¦¬ ]
⇒ Redisμ Sorted Setμ μ΄μ©ν΄ ꡬνν λκΈ°μ΄μμ νμ¬ λκΈ°μ΄μ μλ μ¬μ©μλ₯Ό μ‘°ν
νκ³ μ¬μ©μμ+1
- rankλ₯Ό μ‘°νν΄μ 리ν΄νλ κ³Όμ μμ λμμ± μ μ΄κ° λμ§ μλ λ¬Έμ κ° λ°μ.
- ꡬ체μ μΌλ‘λ μ¬μ©μ Aμ μ¬μ©μ Bκ° λμμ ꡬ맀νκΈ° λ²νΌμ λλ μ λ, λλ€ μλ²μ΄ 1λ‘ λ΄λ€.
π λͺ©ν
- Redisλ₯Ό μ΄μ©ν΄ λΆμ°λ½μ ꡬνν΄μ κ²°μ μν μ¬κ³ κ΄λ¦¬μ μλ΅μλ ν₯μ(μ λ§ μ€μ΄λλμ§ μ²΄ν¬ ν΄λ΄μΌν¨)
- λκΈ°μ΄ λμμ± μ μ΄
π€ Redisλ₯Ό μ΄μ©ν λΆμ°λ½ ꡬν
βοΈ λνμ μΈ μλ°μ Redis ν΄λΌμ΄μΈνΈ
Lettuce
- Spring 2.x.x μ΄νλΆν°, defaultλ‘ μ¬μ©λλ redis ν΄λΌμ΄μΈνΈ
- Lettuceλ‘ λΆμ°λ½μ μ¬μ©νκΈ° μν΄μλ
setnx
,setex
λ±μ μ΄μ©ν΄μ λΆμ°λ½μ μ§μ ꡬνν΄μΌν¨ - κ°λ°μκ° μ§μ retry, timeoutκ³Ό κ°μ κΈ°λ₯μ ꡬνν΄μΌνλ λ²κ±°λ‘μμ΄ μμ
⇒ μ€νλ½
μ΄λΌλ μΌμ’
μ polling κΈ°λ²μ νμ©ν΄μ Lock νλμ μλ (μ£ΌκΈ°μ μΌλ‘ κ³μ μμ²)
Redission (μ ν)
- RedLock μκ³ λ¦¬μ¦μ μλ°λ‘ ꡬνν λΌμ΄λΈλ¬λ¦¬
- λ³λμ Lock interface μ§μ. (λ½μ λν΄ timeoutκ³Ό κ°μ μ€μ μ§μ)
⇒ Redisμ pub/sub
κΈ°λ₯μ μ¬μ©ν΄ Lock νλμ μ¬μλ.
- Lock νλμ μ€ν¨νλ©΄, Redissionμ νΉμ μ±λμ ꡬλ νκ³ , Lockμ΄ λ€μ νλν μ μλ μνκ° λλ€λ μ΄λ²€νΈλ₯Ό λ°μμ λ, λ€μ Lock νλ μλ
π Redis clientλ‘ Redission μ νν μ΄μ
β RedissionμΌλ‘ Redis ν΄λΌμ΄μΈνΈ μ€μ νκΈ°
build.gradleμ μμ‘΄μ± μΆκ°
implementation 'org.redisson:redisson-spring-boot-starter:3.18.0'