Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

분산 락(Distributed Lock) 구현 #1

Open
downfa11 opened this issue Jun 28, 2024 · 0 comments
Open

분산 락(Distributed Lock) 구현 #1

downfa11 opened this issue Jun 28, 2024 · 0 comments
Assignees

Comments

@downfa11
Copy link
Owner

우리는 비즈니스 로직의 임계 구역의 상호 배제를 보장하기 위해 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을 점유할 수 있다는 장점

    final RLock lock = redissonClient.getLock(lockName);
    
    try{
        if(!lock.tryLock(1,3, TimeUnit.SECONDS))
            return;
        
        /*logic*/
     
    } catch (InterruptedException e){
        	e.printStackTrace();
    } finally{
        if(lock!=null && lock.isLocked()) {
            lock.unlock();
        }
    }
    

InventoryServiceTest의 BuyWithoutLock, BuyWithLock 간의 차이를 확인

  • Lock 사용시 동시 접근이 제한되어 원하는 로직이 잘 수행됨
  • Lock 미사용시 중복해서 개수를 소모하지 않는 경우를 확인

트랜잭션 어노테이션에서 propagation 옵션을 Propagation.REQUIRES_NEW으로 트랜잭션을 분리한다면 베타락(xlock)을 구현할 수 있다.

@downfa11 downfa11 self-assigned this Jun 28, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant