-
redis를 활용한 동시성 문제 해결 - 2. Redisson백엔드 관련 강의 공부/동시성 이슈 - 재고시스템 2024. 2. 4. 14:29
Redisson은 pub-sub 기반의 Lock으로 구현된다. pub-sub은 채널을 하나 만들고 lock을 가지고 있는 Thread가 lock을 해제할 때 lock을 획득하려고 하는 Thread에게 message를 보내주는 방식이다.
이번에도 터미널에서 도커환경으로 들어가는데, redis-cli를 2개 킨 사진이다. 왼쪽에서 subscribe ch1로 채널을 만든 다음에 오른쪽에서 ch1에게 hello라고 message를 보내는 방식을 코드로 구현해서 동시성 문제를 해결하겠다.
이전 포스팅에서의 Lettuce는 계속해서 획득을 시도하는 반면에 Redisson은 message가 오는 한 시점에만 획득을 시도하기 때문에 redis의 부하를 줄여준다는 장점이 있다.
RedissonLockStockFacade.class
@Component public class RedissonLockStockFacade { private RedissonClient redissonClient; private StockService stockService; public RedissonLockStockFacade(RedissonClient redissonClient, StockService stockService) { this.redissonClient = redissonClient; this.stockService = stockService; } public void decrease(Long id, Long quantity) { RLock lock = redissonClient.getLock(id.toString()); try { boolean available = lock.tryLock(10, 1, TimeUnit.SECONDS); if (!available) { System.out.println("lock 획득 실패"); return; } stockService.decrease(id, quantity); } catch (InterruptedException e) { throw new RuntimeException(e); } finally { lock.unlock(); } } }
Redisson은 repository를 라이브러리에서 제공하기 때문에 별도로 작성할 필요는 없고 위와 같이 RedissonClient를 사용하면 된다. 일정 시간안에 lock 획득을 실패하면 로그를 남기고 그냥 return한다. 정상적으로 lock이 획득되면 decrease 메서드를 통해서 재고 수량을 감소시켜주고, unlock을 시켜준다.
Lettuce와 Redisson의 장단점
Lettuce
- 구현이 간단함
- spring data redis를 이용하면 lettuce가 기본이기에 별도의 라이브러리 사용하지 않아도 됨
- spin lock 방식이기 때문에 동시에 많은 Thread가 획득 대기 상태라면 redis에 부하가 갈 수 있음
Redisson
- 락 획득 재시도를 기본으로 제공
- pub-sub 방식이기 때문에 Lettuce 대비 redis에 부하가 덜 감
- 별도의 라이브러리를 사용해야 함
- lock을 라이브러리 차원에서 제공하기 때문에 사용법을 자세히 알고 있어야 함
결론
- 재시도가 필요하지 않은 lock - Lettuce 사용
- 재시도가 필요한 경우 - Redisson 사용
'백엔드 관련 강의 공부 > 동시성 이슈 - 재고시스템' 카테고리의 다른 글
redis를 활용한 동시성 문제 해결 - 1. Lettuce (0) 2024.02.04 mysql을 활용한 동시성 문제 해결 - 3. Named Lock (0) 2024.02.03 mysql을 활용한 동시성 문제 해결 - 2. Optimistic Lock (0) 2024.02.03 mysql을 활용한 동시성 문제 해결 - 1. Pessimistic Lock (0) 2024.02.03 재고 시스템에서 동시성 문제 (0) 2024.02.03