개발놀이터

JPA Pessimistic Lock을 Redis 분산락으로 교체하기 본문

사이드 프로젝트/온라인 쇼핑몰 ver.6

JPA Pessimistic Lock을 Redis 분산락으로 교체하기

마늘냄새폴폴 2024. 7. 6. 21:47

기존 프로젝트에서 동시성 문제가 발생하였고 이를 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 부하 테스트

 

Redis Distributed Lock 부하 테스트

 

전체적인 부하는 비슷하고 기존 Pessimistic Lock을 사용했을 때 MySQL에 부하가 많이 몰리는 반면 Redis의 Distributed Lock을 사용했을 때는 MySQL의 부하가 줄고 Redis가 부하를 나눠 담당하는 것을 볼 수 있습니다. 

 

 

이로인해 얻은 것

기존 방식은 MySQL의 부하가 몰려 서버의 장애 상황을 야기한다면 개선한 방식은 Redis가 부하를 분산시켜 락킹 매커니즘으로인한 MySQL의 커넥션 풀의 불안정성을 개선하였습니다. 

 

이로인해 다양한 동시성 문제에 대해 MySQL의 안정성을 끌어올릴 수 있었습니다. 

 

 

블로그 글

https://coding-review.tistory.com/527

 

Spring AOP 와 Redis의 분산락이 만나면

일단 포스팅은 아래의 링크를 참고하였습니다.  https://helloworld.kurly.com/blog/distributed-redisson-lock/ 풀필먼트 입고 서비스팀에서 분산락을 사용하는 방법 - Spring Redisson어노테이션 기반으로 분산락

coding-review.tistory.com