Named Lock - λΆμ°λ½μ μ΄μ©ν μ€λ³΅ μμ½ λμμ± λ¬Έμ ν΄κ²°
1. λΆμ°λ½μ μ μ©νκ² λ μν©
λ§μ½ μ¬λ¬ μ¬μ©μκ° λμμ κ°μ μκ°λμ΄κ±°λ κ²ΉμΉλ μκ°λμ μμ½ μ§ν μ μ΄λ»κ² μ€λ³΅ μμ½μ λ§μ μ μμμ§ λ¬Έμ μλ€.
ν΄λΉ μμ½ ν μ΄λΈμ μλμ κ°μ΄ μμ± λμ΄μλ€. νλμ νμ ν μ΄λΈμ μ΄λ―Έ μμ½λ λ°μ΄ν°μ μκ°μ΄ κ²ΉμΉμ§ μμμΌλ§ μμ½μ΄ κ°λ₯νλ€.
λμμ 100λͺ μ μ¬μ©μκ° λκ°μ (μκ° + μ₯μ)λ₯Ό μμ½νμ λ 8κ°μ μ€λ³΅ λ°μ΄ν°κ° λ°μνμλ€.
2. MySQLμ μ΄μ©ν λΆμ°λ½μ ꡬνν μ΄μ
λΆμ°λ½μ ꡬννλ λ°©λ²μ λν΄ κ²μν΄λ³΄λ©΄ Redisλ₯Ό μ΄μ©ν λ°©λ²μ΄ λ§μ΄ 보μΈλ€.
νμ§λ§ Redisλ₯Ό μ΄μ©νκ² λλ©΄ μΆκ°μ μΈ μΈνλΌ κ΅¬μΆλΉμ©μ΄λ μ μ§λ³΄μ λΉμ©μ΄ λ°μνλ€.
λ°λΌμ, λλ κΈ°μ‘΄μ μ¬μ©νκ³ μλ MySQLμμ μ 곡νλ NAMED LOCKμ μ΄μ©νμ¬ Lockμ μ΄λ¦μ μ§μ ν μ μκΈ° λλ¬Έμ ν΄λΉ Lockμ μ΄λ¦μ μ΄μ©νμ¬ μ ν리μΌμ΄μ λ¨μμ μ μ΄κ° κ°λ₯νλ€λ μ₯μ μ μ΄μ©νκΈ°λ‘ νλ€.
3. Named Lockμ λν κ°λ¨ μ€λͺ
Named Lockμ μ΄λ¦μ κ°μ§ metadata lockμ΄λΌκ³ ν μ μλ€. μ΄λ¦μ κ°μ§ lockμ νλν ν ν΄μ ν λκΉμ§ λ€λ₯Έ μΈμ μ μ΄ Lockμ νλν μ μλλ‘ νλ€. λ°μ΄ν° μ½μ μμ μ ν©μ±μ λ§μΆ°μΌ νλ κ²½μ° μ¬μ© κ°λ₯νλ€.
β μ£Όμν μ μΌλ‘λ transactionμ΄ μ’ λ£λ λ lockμ΄ μλμΌλ‘ ν΄μ λμ§ μλλ€λ κ²μ΄λ€. λ³λμ λͺ λ Ήμ΄λ‘ ν΄μ λ₯Ό μνν΄ μ£Όκ±°λ μ μ μκ°μ΄ λλμΌ ν΄μ λλ€.
- μ΄λ¦κ³Ό ν¨κ» lockμ νλνλ€. ν΄λΉ lock μ λ€λ₯Έ μΈμ μμ νλ λ° ν΄μ κ° λΆκ°λ₯νλ€.
- mysqlμμλ get_lock()μ ν΅ν΄ lockμ μ»κ³ , release_lock()μ΄λΌλ λͺ λ Ήμ΄λ₯Ό ν΅ν΄ named lockμ ν΄μ ν μ μλ€.
- Pessimistic, Optimistic lockμ itemμ λν΄μ lockμ κ±Έμλ€λ©΄ named Lockμ λ³λ MySQL μλ² λ©λͺ¨λ¦¬ 곡κ°μ lockμ 건λ€.
GET_LOCK(name, timeout)
- μ λ ₯λ°μ μ΄λ¦μΌλ‘ timeoutμ΄ λμ μ κΈ νλμ μλνλ€.
- λ§μ½μλΌλ μ κΈμ νλν λκΉμ§ 무νλλ‘ λκΈ°νλλ‘ νλ €λ©΄ timeoutμ μμλ‘ μ€μ νλ©΄ λλ€.
- ν sessionμμ μ κΈμ μ μ§νκ³ μλ λμμλ λ€λ₯Έ sessionμμ λμΌν μ΄λ¦μ μ κΈμ νλν μ μλ€.
- GET_LOCK()μ μ΄μ©νμ¬ νλν μ κΈμ Transactionμ΄ commit λλ rollback λλλΌλ μ€μ€λ‘ ν΄μ λμ§ μλλ€.
- GET_LOCKμ κ²°κ³Όκ°μ 1, 0, nullμ λ°ννλ€.
- 1 : μ κΈμ νλνλλ° μ±κ³΅
- 0 : timeout μ΄ λμ μ κΈ νλ μ€ν¨
- null : μ κΈ νλ μ€ μλ¬κ° λ°μ (ex : Out of Memory, νμ¬ μ€λ λκ° κ°μ μ’ λ£λ¨)
- MySQL 5.7 λ²μ μ΄νλΆν°λ λμμ μ¬λ¬κ°μ μ κΈμ νλ κ°λ₯νκ³ , μ κΈ μ΄λ¦ κΈμμκ° 60μλ‘ μ νλμμμ μ μνμ.
RELEASE_LOCK(name)
- μ λ ₯λ°μ μ΄λ¦μ μ κΈμ ν΄μ νλ€.
- RELEASE_LOCKμ κ²°κ³Όκ°μ 1, 0, nullμ λ°ννλ€.
- 1 : μ κΈμ μ±κ³΅μ μΌλ‘ ν΄μ
- 0 : μ κΈμ΄ ν΄μ λμ§λ μμμ§λ§, νμ¬ μ°λ λμμ νλν μ κΈμ΄ μλκ²½μ°
- null : μ κΈμ΄ μ‘΄μ¬νμ§ μμ
- RELEASE_ALL_LOCKS() λͺ λ Ήμ ν΅ν΄ νμ¬ μΈμ μμ μ μ§λκ³ μλ λͺ¨λ μ κΈμ ν΄μ νκ³ ν΄μ ν μ κΈ κ°μλ₯Ό λ°νλ°μ μ μλ€.
ETC
- IS_FREE_LOCK(name)
- μ
λ ₯ν μ΄λ¦μ ν΄λΉνλ μ κΈμ΄ νλ κ°λ₯νμ§ νμΈνλ€.
- 1 : μ λ ₯ν μ΄λ¦μ μ κΈμ΄ μμ
- 0 : μ λ ₯ν μ΄λ¦μ μ κΈμ΄ μμ
- null: μλ¬ λ°μ (ex: μλͺ»λ μΈμ)
- μ
λ ₯ν μ΄λ¦μ ν΄λΉνλ μ κΈμ΄ νλ κ°λ₯νμ§ νμΈνλ€.
- IS_USED_LOCK(name)
- μ λ ₯ν μ΄λ¦μ μ κΈμ΄ μ¬μ©μ€μΈμ§ νμΈνλ€.
- μ λ ₯λ°μ μ΄λ¦μ μ κΈμ΄ μ‘΄μ¬νλ©΄ connection idλ₯Ό λ°ννκ³ , μμΌλ©΄ nullμ λ°ννλ€.
4. λΆμ°λ½ ꡬν
1. DataSource λΆλ¦¬
Lockμ μ»κΈ° μν DataSourceλ₯Ό λΆλ¦¬ν¨μΌλ‘μ¨, Lockμ΄ νμνμ§ μμ μμ²λ€μ λν΄μ 컀λ₯μ
νμ 보μ₯ν΄μ€ μ μλ€.
μλνλ©΄, 컀λ₯μ
νλ§ λ λλ €λ΄€μ Lockμ΄ νμν μμ²λ€μκ² λͺ¨λ μ μ λΉν΄λ²λ¦°λ€λ©΄ Lockμ΄ νμνμ§ μμ μμ²λ€μ 컀λ₯μ
νμ λ°νλκΈ° κΉμ§ λκΈ°ν΄μΌ νλ λ¬Έμ κ° μκΈ°λ―λ‘ ConnectionPoolμ λΆλ¦¬νλ κ²μ΄λ€.
2. λΆλ¦¬λ Named Lockμ© DataSourceλ₯Ό μ΄μ©ν JDBC ꡬν
β
JdbcTemplateμ μ΄μ©νμ§ μμ μ΄μ λ?
JdbcTemplateμ νΉμ±μ GET_LOCKμ μννλ μΏΌλ¦¬κ° μ€νλκ³ νΈλμμ
μ΄ μ’
λ£λκ² λλ©΄ pollμμ μ»μ΄μ¨ Connectionμ λ°ννκ² λλ€.
1. κ·Έλμ RELEASE_LOCKμ μ€νν λ GET_LOCKμ μ€νν λμ λ€λ₯Έ Connectionμ μ»μ΄μ€λ λ¬Έμ κ° μκΈ°μ LOCKμ μ λλ‘ λ°ν λͺ»ν μλ μλ€.
2. λν λμμ λμΌν Lock μ΄λ¦μΌλ‘ μμ²ν λ€λ₯Έ μ€λ λμμ GET_LOCKμμ λ°ννλ Connectionμ νλνμ¬ μ κΈμ νμ΄λ²λ¦΄ μνλ μ‘΄μ¬νλ€.
λ°λΌμ λλ λΆλ¦¬λ DataSourceλ₯Ό μ£Όμ λ°μ JDBCλ‘ μ§μ ꡬννμλ€. JDBCλ₯Ό μ΄μ©ν΄ μ§μ ꡬννμκΈ°μ Connectionμ μ§μ κ΄λ¦¬ν μ μμ΄μ GET_LOCKκ³Ό RELEASE_LOCKμ΄ λͺ¨λ λμΌν Connectionμ μ¬μ©ν μ μμκ³ νλν LOCKμ μ μμ μΌλ‘ λ°νν μ μκ² κ² λμλ€.
executeWithLock() λ©μλμμλ @Transactionalμ λΆμ΄μ§ μμλ€. μλνλ©΄ Lockμ μ»λ λΆλΆκ³Ό μμ½ λ‘μ§μ μννλ λΆλΆμμ μ¬μ©νλ ConnectionPoolμ κ°κΈ° λ€λ₯΄κ² νκΈ° μν΄ @Transactionalμ λΆμ΄μ§ μμλ€.
νλ²μ νΈμΆλ‘ Lockμ μ»κ³ , Lockμ ν΄μ νλ μμ
μ νκΈ° μν΄ μμ½ λΉμ§λμ€ λ‘μ§μ Supplier μΈν°νμ΄μ€λ₯Ό μ΄μ©ν μ½λ°±μΌλ‘ μνλλλ‘ κ΅¬ννλ€.
GET_LOCKκ³Ό RELEASE_LOCKμ 1, 0, nullμ κ°μ λ°ννλ€.
λ°λΌμ getLockκ³Ό releaseLock λ©μλμμ λ°νκ°μ΄ 0, nullμΈ κ²½μ°λ₯Ό 체ν¬νμ¬ μ κΈμ΄ ν΄μ λλμ§κΉμ§ νμΈν΄μΌνκ³ , μ μ ν β
μμΈμ²λ¦¬λ₯Ό ν΄μ£Όμ΄μΌ νλ€.
timeout μκ°μ μ§§κ² μ£Όμμ κ²½μ°λ λ½μ΄ νλ €λ²λ¦¬λ κ²½μ°κ° λ°μν μ μκ³ μκ°μ λ무 κΈΈκ² μ£Όλ©΄ releaseλ₯Ό νμ§ λͺ»νμ κ²½μ° μλΉμ€μλμ νλ‘ μ΄μ΄μ§ μ μλ€. μΌλ°μ μΌλ‘ 2~5μ΄ μ¬μ΄λ©΄ μ λΉνλ€.
5. λμμ± ν μ€νΈ + TPS μΈ‘μ
1.Jmeterλ₯Ό μ΄μ©ν ν μ€νΈ
μ΄μμλ²μ λν΄μ 100λͺ
μ΄ λμμ μ€λ³΅ μμ½νλ μν©μ ν
μ€νΈνλ€.
ν
μ€νΈ ν κ²°κ³Ό νλμ μμ²λ§ μ±κ³΅νκ³ λ€λ₯Έ μμ²λ€μ μ€ν¨ν¨μΌλ‘μ¨ λμμ± μ²λ¦¬κ° μλμμμ λ³Ό μ μμλ€.
2. Junitμ μ΄μ©ν ν μ€νΈ
μμ κ°μ΄ 100λͺ μ΄ λμμ μ€λ³΅λλ μμ½μ μμ²νλ ν μ€νΈμμ 1κ°μ μμ½λ§ DBμ μ½μ λμμμ λ³Ό μ μμλ€.