커넥션 풀 고갈 문제를 Redis Atomic 연산으로 개선하기
장애 상황 이슈 생성 API의 부하 테스트를 통해 안정적인 서비스 제공과 우수한 성능을 달성하는 것을 목표로 설정했습니다. 그러기 위해서 대규모 조직(1000명 이상)에서 50~100명의 사용자가 동시에 이슈를 생성하는 상황을 가정했을 때, 다음과 같이 요청-응답 시간(MTT)은 1~2초 이내, TPS는 30~40, 에러율은 0.1% 이하, 테스트...
장애 상황 이슈 생성 API의 부하 테스트를 통해 안정적인 서비스 제공과 우수한 성능을 달성하는 것을 목표로 설정했습니다. 그러기 위해서 대규모 조직(1000명 이상)에서 50~100명의 사용자가 동시에 이슈를 생성하는 상황을 가정했을 때, 다음과 같이 요청-응답 시간(MTT)은 1~2초 이내, TPS는 30~40, 에러율은 0.1% 이하, 테스트...
Redis 버전 7.0.15 기준으로 설명합니다. Redis Master Slave Architecture 기본적인 Redis Replication 구조는 Master-Replica 구조로 이루어져 있습니다. Master는 데이터를 저장하고, Replica는 Master의 데이터를 복제합니다. 레디스는 비동기(asynchronous...
이때 설명하기 쉽게 BookChallengeApplication을 시작점으로 하겠습니다. @SpringBootApplication public class BookChallengeApplication { public static void main(String[] args) { SpringApplication.run(BookChallengeApp...
문제 사항 1. 책 조회 페이징 API (TPS 4.3) 책 조회에 대한 페이징 API를 구현한 뒤, Ngrinder를 통해 TPS를 확인해보니 4.3 으로 매우 낮은 상태였습니다. 책 ID(클러스터 인덱스)로 조회했을 때 최대 TPS는 약 230에 비해 현저히 낮은 상태였습니다. 이 문제점을 개선하기 위해 다음과 같은 과정을 진행했습니다. 테스...
0. 실행 환경 SpringBoot 3.3.2 MySQL 8.1 (Docker 이용) Mac OS 1. DockerCompose 구성 Docker Compose 파일은 MySQL 마스터와 슬레이브 인스턴스를 설정합니다. version: '3' services: mysql-master: image: mysql:8.0 ...
스레드로컬이 뭔가요? ThreadLocal은 멀티 스레드 환경에서 각각의 스레드가 별도의 변수를 저장하고 사용할 수 있습니다. 스레드 로컬은 어떻게 구현되어 있나요? 단계별로 설명해보세요 1단계 구현 ThreadLocal<T>를 구현하려고 할 때 Thread.currentThread()를 키로 사용하는 ConcurrentHashMap...
클라이언트에서 처음 Swagger 페이지를 GET 요청했을 때 흐름을 적었습니다. DispatcherServlet 요청 흐름 클라이언트의 요청은 서블릿 컨테이너에서 필터들을 지나 스프링 컨텍스트내 DispatcherServlet이 가장 먼저 요청을 받습니다. DispatcherServlet의 doService 메소드에서 웹 요청 처리가 진...
스레드를 직접 구현해서 사용할 때 문제점 스레드 생성 비용으로 인한 성능 문제 : 스레드 생성하는 작업은 시스템 콜을 통해 처리되며, 이는 OS 커널 레벨에서 메모리 할당등이 일어나기 때문에 성능이 느립니다. 또한, 새로운 스레드가 생성되면 운영체제의 스케줄러는 이 스레드를 관리하고 ...
컬렉션 프레임워크는 원자적인 연산이 아니고 여러 연산이 들어가 있기 때문에 멀티 스레드 상황에서 문제가 생깁니다. 따라서 동시성 컬렉션을 만들기 위해 여러가지 도입을 했습니다. 프록시 도입 ArrayList, LinkedList, HashSet, HashMap 등의 코드도 모두 복사해서 synchronized 기능을 추가한다는 것은 매우 비효율적입...
생산자 소비자 문제란 생산자 소비자 문제는 멀티스레드 프로그래밍에서 자주 등장하는 동시성 문제 중 하나로, 여러 스레드가 동시에 데이터를 생산하고 소비하는 과정에서 발생합니다. 생산자란, 데이터를 생성하는 역할을 하며, 파일에서 데이터를 읽어오거나 네트워크에서 데이터를 받아와 버퍼에 저장하는 역할을 하는 스레드입니다. 소비자란, 생성된 데이터를 ...