You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Java의 synchronized처럼 언어에서 제공하는 Lock 이외에도, 여러 서버에서 임계 구역을 접근하는 경우에는 분산 락 기법이 필요하다.
분산 락(Distributed Lock)의 구현 방법
Redis(Lettuce) SETNXEX SETNX는 key가 존재하면 SET이 실패하고, key가 없으면 SET이 성공한다. (원자성(Atomic) 보장)
SET의 성공 여부를 Lock 획득 성공 여부로 간주하도록 스핀락 형태의 분산 락 구현
다만, 반복적인 점유 시도로 redis가 부하를 받는다
SQL DB Lock SELECT ~ FOR UPDATE 등의 row lock이나 USER-LEVEL Lock 등을 활용하는 방법
우리는 비즈니스 로직의 임계 구역의 상호 배제를 보장하기 위해 Lock을 사용한다.
Java의 synchronized처럼 언어에서 제공하는 Lock 이외에도, 여러 서버에서 임계 구역을 접근하는 경우에는 분산 락 기법이 필요하다.
분산 락(Distributed Lock)의 구현 방법
Redis(Lettuce) SETNXEX
SETNX
는 key가 존재하면 SET이 실패하고, key가 없으면 SET이 성공한다. (원자성(Atomic
) 보장)SET의 성공 여부를 Lock 획득 성공 여부로 간주하도록 스핀락 형태의 분산 락 구현
다만, 반복적인 점유 시도로 redis가 부하를 받는다
SQL DB Lock
SELECT ~ FOR UPDATE
등의 row lock이나USER-LEVEL Lock
등을 활용하는 방법Redis의 Redisson
Redis에서 제공하는 Redisson 라이브러리에서 분산 락을 제공한다.
tryLock(waitTime, leaseTime, TimeUnit)
: waitTime동안 Lock 점유를 시도하고, leaseTime만큼 락을 사용하거나 lock 해제lock 접근시 선행 쓰레드가 존재하면 waitTime동안 Lock 점유를 기다린다.
leaseTime만큼 지나면 lock이 해제되기 때문에 다른 쓰레드도 일정 시간이 지나면 Lock을 점유할 수 있다는 장점
InventoryServiceTest의
BuyWithoutLock
,BuyWithLock
간의 차이를 확인트랜잭션 어노테이션에서 propagation 옵션을
Propagation.REQUIRES_NEW
으로 트랜잭션을 분리한다면 베타락(xlock)을 구현할 수 있다.The text was updated successfully, but these errors were encountered: