분류 전체보기4 Redis 캐시 쇄도 해결하기 현재 캐시 유효 시간(TTL)을 최대 하루로 설정하였다. 만약 10000명의 많은 사용자들의 캐시 유효시간이 만료되어 동시에 DB에 다시 접근하여 다시 DB에 접근하게 된다면?이런 현상은 캐시 쇄도(Cache Stamped)라 한다.동시에 많은 사용자들이 DB에 접근하게 된다면 DB의 부담이 커져서 서비스 장애로 이어질 수 있다.해결방안Randomized TTL캐시 만료 시간에 랜덤 값을 추가하여 캐시의 동시 만료를 방지하고, 캐시 갱신 시점을 분산한다.예시 : 캐시 만료 시간 + (0~60)초로 무작위 시간 추가(base_ttl + random(0, jitter)선제적 갱신(Early Refresh)캐시가 만료되기 전에 선제적으로 갱신분산락(DistributedLock)최초 하나의 요청만 락을 획득하여.. 2026. 2. 23. 부하 분산을 위한 MySQL을 Master/Slave 이중화(Docker) 개인 프로젝트로 책 커뮤니티 서비스를 진행 중 현재는 데이터베이스가 잘 동작하고 별 문제가 없지만, 앞으로 서비스를 진행하면서 사용자가 많아 지면 데이터베이스가 문제 없이 돌아갈까? 하는 고민부터 시작되었다.Replication은 왜 필요한가요?Scale-out Solutions(부하분산)일종의 부하 분산을 의미한다. DB에 접근해서 처리해야 하는 것들이 대부분이다. 읽기, 쓰기, 수정의 모든 연산이 하나의 DB에서 일어난다면 트래픽이 늘어남에 따라 자연스럽게 병목 현상이 생길 수 밖에 없다.쓰기는 원본 서버에서만 수행하게 하고 읽기 기능은 원본의 복제 서버에서 읽어오게 한다면 쓰기의 기능과 읽기의 기능을 병목없이 모두 향상시킬 수 있게 된다.따라서 부하를 줄이기 위해 DB를 이중화하여 Master에서는.. 2026. 2. 11. 쿠폰 동시성 발급 문제 레디스(분산 락)으로 해결하기 동시에 여러 스레드가 쿠폰을 발급하는 기능에 대해 발생되는 동시성 문제가 있었습니다.100개의 스레드가 동시에 쿠폰 발급을 요청하는 통합 테스트코드를 작성해보겠습니다.테스트를 위한 사전 작업private Long couponId;@BeforeEachvoid setUp(){ //테스트용 쿠폰 100장 생성 String uniqueName = "Coupon-" + UUID.randomUUID().toString(); Coupon coupon = new Coupon(uniqueName, 100, 3000L); Coupon saveCoupon = couponRepository.save(coupon); coupon = saveCoupon; this.couponId = saveCou.. 2026. 2. 4. [#15] 다중 서버 환경에서 로그인 정보는 어디에 저장할까? 이 글은 세션 방식에 대해 다룹니다.크게 많이 사용하는 로그인 방식으로는세션 방식토큰 방식세션 방식은 보통 서버에 로그인 정보를 저장합니다. Scale-out을 하기 전에는 한 대의 WAS 서버로 세션을 처리했습니다.하지만 서버의 대수를 늘린 후에는 세션을 어느 서버에 저장할 것인지 이슈가 발생합니다.만약 1번 서버에 어떤 사용자가 세션을 저장하고 E-Book을 구매하는 Request가 2번 서버로 전달된다면 2번 서버에서는 이 사용자의 세션이 없기 때문에 로그인이 유지되지 않는 문제가 발생합니다. 따라서 이러한 Session 정합성 문제를 해결해야 합니다.Session 정합성 문제를 해결하기 위해 고려한 방법1. Sticky Session어떠한 사용자의 세션이 1번 서버에서 생성되었다면 이 사용자의 R.. 2026. 1. 23. 이전 1 다음