[항해 플러스 Lite 1기] 6주차 - 분산락 적용 및 캐싱
Redis 기반 분산락 적용 및 캐싱
이번 주차에서 얻어가고 싶은 것
분산 환경에서의 동시성 문제를 어떻게 다뤄야 할지에 대한 감을 잡고 싶었다.
특히, 단일 인스턴스가 아닌 멀티 인스턴스 환경에서 데이터 정합성을 보장하려면 어떻게 해야 하는지 실제 적용을 통해 체득해보고 싶었다.
또한, 데이터 조회 성능 개선을 위해 Redis를 활용한 캐싱 전략을 실험하고, 실제로 성능이 얼마나 향상되는지도 확인하고 싶었다.
과제 요구사항
- 분산락 구간 식별 및 분산락 적용
- 캐싱이 필요한 부분 식별 및 캐싱 적용
- 동시성 테스트 및 캐시 성능 비교 테스트
문제 상황
(1) 베스트셀러 데이터를 매번 DB에서 조회하면서 트래픽이 증가할수록 응답 지연이 발생했고, 특정 시점에서는 DB 부하가 급격히 올라가는 문제가 있었다.
(2) 인기 도서 정보를 여러 사용자가 동시에 요청하는 상황에서, 캐시 갱신 타이밍이 맞지 않아 중복 계산, 서로 다른 값 노출 등의 문제가 발생했다.
(3) 기존에는 분산 환경에서 락을 걸 수 있는 구조가 아니었기 때문에, 캐시 갱신 시점에 race condition이 발생할 수 있는 여지가 많았다.
시도
(1) Redisson의 분산락 기능을 사용했다. 캐시 미스가 발생한 경우에만 락을 획득하여 DB를 조회하고, 조회된 값을 캐시에 저장하도록 처리했다. RLock.tryLock()을 활용해 불필요한 대기를 줄이되, 락 획득 실패 시 적절한 예외 처리를 추가했다.
(2) 캐시는 Look-aside 캐시 전략으로 구성했다. 조회 시 먼저 Redis에서 데이터를 확인하고, 없을 경우 DB에서 조회 후 Redis에 저장하는 방식이다.
(3) k6 부하 테스트를 통해 캐싱 적용 전후의 응답 속도와 에러율, 처리량 등을 비교해보았다. 동시에 여러 요청이 들어오는 상황에서도 캐시가 제대로 동작하는지를 중점적으로 관찰했다.
해결
(1) Redisson을 활용해 분산 환경에서도 안전하게 락을 걸 수 있었고, 덕분에 캐시 갱신 시점의 race condition 문제를 방지할 수 있었다.
(2) Redis 캐시를 적용한 후에는 조회 성능이 눈에 띄게 향상되었고, DB에 대한 조회 부담도 상당히 줄어들었다. 특히 반복적으로 요청되는 인기 도서 데이터에 대해서는 캐시 히트율이 높아져 전반적인 시스템 응답 속도가 안정화되었다.
(3) 캐시 무효화 정책(예: TTL 설정)과 함께, 갱신 주기 및 트래픽 패턴을 고려해 지능적인 갱신 조건을 설정하려는 방향으로 리팩토링도 진행 중이다.
알게된 것
분산 환경에서는 단일 인스턴스의 락으로는 절대 문제를 해결할 수 없다는 점을 다시 한 번 체감했다. Redisson은 락의 개념을 Redis 기반으로 외부화함으로써, 멀티 인스턴스 간에도 정합성을 유지할 수 있게 해준다.
그리고 캐시는 단순히 붙이기만 해서 끝나는 것이 아니라, 락과 함께 고민되어야 한다는 점이 중요하다. 특히 TTL, 동시성 제어, 캐시 갱신 로직이 유기적으로 잘 엮이지 않으면 오히려 정합성을 해치는 요소가 될 수 있다.
아쉬운 점
Redisson은 도입 자체는 어렵지 않았지만, 락 해제 시점 관리나 예외 발생 시의 처리 등이 까다로운 측면이 있었다. 예상치 못한 예외가 발생할 경우 락이 풀리지 않는 이슈를 방지하기 위해 finally 블록에서의 명시적 해제가 필수라는 점도 실전에서 부딪히며 배웠다.
특히 분산락을 적용하기 전, 실패하는 동시성 테스트를 작성하는데에 실패하여 분산락이 과연 정말 잘 적용되었는지 확인할 수 없는 점이 너무 아쉬웠고, 얼른 보완해야겠다고 느꼈다.
또한, 캐시 적용 시 초기 TTL 설정이나 갱신 조건을 지나치게 보수적으로 잡아버린 탓에 불필요하게 자주 갱신이 발생하기도 했고, 이로 인해 락 경쟁이 생기기도 했다. 결국 "적절한 TTL"이라는 것은 트래픽 패턴을 충분히 분석한 뒤에야 설정 가능하다는 점을 느꼈다.
다음 주차 목표
여태 적용해온 기술들을 다시 한번 짚어보며, 잘못된 부분을 찾고 개선할 수 있도록 하자. 알고리즘 공부도 마냥 게을리 할 수 없기에 병행했는데 역시 쉽지 않은 것 같다.
Redis가 괜히 많이 사용되는게 아닌 것 같다. 캐싱 리모트 서버부터 시작해서 동시성 제어까지... 너무 유용하고 매력적인 기술인 것 같다. 어떻게 더 잘 활용할 수 있을지 더 학습하고 적용해봐야겠다.
부하 테스트를 진행하다보니 과연 잘 하고 있는걸까 라는 생각이 많이 들었다. 결국 잘 관찰하는 게 중요한데, 모니터링에 대해 관심을 가져보자.
항해플러스 Lite 백엔드 2기 모집이 시작되었습니다!
관심있는 분들께서는 아래 페이지 읽어보시고 등록하실 때 아래 코드 입력하시면 10만원 추가 할인을 받으실 수 있습니다!
과정 상 궁금하신 내용은 댓글 남겨주시고 추후 후기를 남길 예정이니 참고하셔도 좋습니다 :)
추천인 코드: o3HXzU
항해 플러스 Lite 백엔드 코스
바쁜 개발자를 위한 1인 부트캠프, 내 일정에 맞춰 꾸준히 학습해요.
hanghae99.spartacodingclub.kr