개발놀이터
JPA Pessimistic Lock을 Redis 분산락으로 교체하기 본문
기존 프로젝트에서 동시성 문제가 발생하였고 이를 JPA의 비관적 락으로 해결하였습니다. 하지만 비관적락이 RDBMS로 하여금 락킹 매커니즘을 관리하기위해 커넥션을 생성하고 이때문에 RDBMS에 부하가 발생한다는 문제가 발생했습니다.
해결방법으로 Redis의 라이브러리인 Redisson을 이용해 분산 락을 구현했습니다. 기존에 사용하던 Lettuce는 스핀락의 개념으로 Redis에 lock을 지속적으로 확인해야 하기 때문에 RDBMS의 부하가 그대로 Redis로 몰린다는 단점이 있었습니다. 때문에 Redisson을 사용하게 되었습니다.
wrk2로 부하 테스트를 진행하였고 docker로 컨테이너를 모니터링 하여 테스트를 진행했습니다.
특징
- RDBMS는 MySQL을 사용하였습니다.
- 스레드는 8개, 동시 커넥션 수는 50개, 시간은 60초, 초당 요청 수는 1000개로 고정하고 같은 환경에서 테스트를 진행했습니다.
- CPU점유율은 Docker 모니터링을 활용했습니다.
- MySQL의 pessimistic lock과 Redis의 distributed lock에 대한 확연한 차이를 위해 동일한 쿼리를 사용했고 컬럼에 인덱스를 설정하였습니다.
전체적인 부하는 비슷하고 기존 Pessimistic Lock을 사용했을 때 MySQL에 부하가 많이 몰리는 반면 Redis의 Distributed Lock을 사용했을 때는 MySQL의 부하가 줄고 Redis가 부하를 나눠 담당하는 것을 볼 수 있습니다.
이로인해 얻은 것
기존 방식은 MySQL의 부하가 몰려 서버의 장애 상황을 야기한다면 개선한 방식은 Redis가 부하를 분산시켜 락킹 매커니즘으로인한 MySQL의 커넥션 풀의 불안정성을 개선하였습니다.
이로인해 다양한 동시성 문제에 대해 MySQL의 안정성을 끌어올릴 수 있었습니다.
블로그 글
https://coding-review.tistory.com/527
'사이드 프로젝트 > 온라인 쇼핑몰 ver.6' 카테고리의 다른 글
Redis Sentinel로 고가용성 유지하기 (with Slack) (0) | 2024.07.17 |
---|---|
Redis를 이용해 대기열 만들기 (0) | 2024.07.08 |
Redis for Client Side Caching으로 응답시간 개선하기 (0) | 2024.07.06 |