728x90
락 (Lock) ?
- 정의
- DB에서 트랜잭션 처리의 순차성을 보장하기 위한 방법 중 하나
- 락의 획득이라는 거은 자원을 사용해도 된다는 의미이며, 다른 프로세스는 현재 락을 획득한 프로세스가 잠금을 건 자원에 대해서 사용할 수 없다.
분산락
- DB 등 공통된 저장소를 이용하여 자원의 사용여부를 체크하기때문에 전체 서버에 동기화된 처리가 가능하다.
- 필요이유
- 서버가 여러 대인 경우 여러 서버로 API가 분산 호출된다.
→ 서버들간에 동기화된 처리가 필요하고, 여러 서버에 공통된 락을 적용해야 하기 때문에 분산락을 이용한다.
- 분산 서버 동시성 제어
- 서버가 여러 대인 경우 여러 서버로 API가 분산 호출된다.
분산 서버 동시성 제어
- 위 상황과 같이 한 자원에 대해서 여러 요청들이 공유할 때, 각 분산 DB의 동기화가 여러 요청의 동기화 속도를 따라가지 못한다.
- 이 때 데이터의 정합성은 깨지고, 데이터 동시성 문제가 발생한다.
- 이러한 문제를 위해 redis에 올려놓고 분산락을 활용한다.
- 여러 요청마다 락을 점유하고 데이터를 업데이트 하기때문에 각 서버는 각 DB의 동기화를 기다리지 안항도 되고, 동시성 문제도 해결할 수 있다.
Redisson
- Redis에 Lettuce의 스핀락 대신에 Redisson의 분산락을 쓰는 이유
- Lettuce는
sentnx
메서드를 이용해 사용자가 직접 스핀락 형태로 구성한다.
- 락이 점유 시도를 실패했을 경우 계속 락 점유 시도를 하기 때문에 redis는 계속 부하를 받고, 응답시간이 지연된다.
- 만료시간을 제공하고 있지 않아서 락을 점유한 서버에 장애가 생기면 다른 서버들도 해당 락을 점유할 수 없게 된다.
- Lettuce는
- 자동 TTL 적용
RedissonLock.java
의tryLcokInnerAsync
메서드를 보면Lua Script
를 사용하여 자체적으로 TTL을 적용시킨다.
- 주요 기능인 RLock의
tryLock
메서드- 파라미터로 들어오는 leaseTime 시간동안 락을 점유하는 시도를 한다.
- 락을 사용할 수 있을 때까지 watTime 시간까지 기다린다.
- leaseTime 시간이 지나면 자동으로 락이 해제된다.
느낀점
- DB와 JPA를 이용하면서 동시성 때문에 여러가지 문제점을 겪은 뒤, 이를 해결하기위한 방법을 알아봤다. redis를 이용하여 동시성을 해결한다는 점에서 새롭게 느껴졌다. 이를 잘 활용한다면 짧은시간에 정해진 갯수에 대한 정확한 값을 필요한 실시간 예매나 선착순 이벤트같은 서비스에 도입해보면 좋을 것 같다.
참조
https://velog.io/@hgs-study/redisson-distributed-lock
https://soyeon207.github.io/db/2021/08/29/distributed-lock.html
https://velog.io/@hgs-study/redisson-distributed-lock
'CI_CD' 카테고리의 다른 글
Jenkins 적용기 (0) | 2022.02.11 |
---|