전체 글 (37) 썸네일형 리스트형 Cache Stampede에 대응하는 캐시 갱신 전략 (PER 알고리즘) 캐시는 대규모 트래픽을 처리하는데 필수적으로 사용된다. 이번 글에서는 Cache Stampede와 이를 막기 위한 캐시 전략들을 알아보려한다.Cache Stampede란?Cache Stampede란 캐시가 만료된 시점에 여러 요청이 동시에 백엔드로 몰리는 현상을 말한다. 이로 인해 서버와 데이터베이스에 과도한 부하가 발생하고, 응답 지연 부터 경우에 따라 대규모 서비스 장애로까지 이어질 수 있다. 특히 이 현상은 몇몇 특정 Hot Key에서 더 큰 문제를 일으킬 수 있다. 이러한 Cache Stampede 현상을 완화하기 위한 몇가지 캐시 갱신 전략들이 있다. JitterJitter는 캐시 만료 시간을 범위내에서 무작위로 설정하는 전략이다. 예를 들어 서비스의 모든 캐시가 10분 단위로 갱신이 된다면 .. 분산 환경에서 선호되는 기본키 생성 전략 (feat. TSID) 프로젝트를 진행하면서 table의 기본키를 Auto Increment로 생성하고 있었다. 그러나 해당 전략을 사용하면 예약 번호, 지점 번호 등 외부에 노출하면 안되는 정보들이 API URL에 포함되고 쉽게 유추할 수 있어 개선이 필요했다. 이에 기본키 생성 전략을 공부하고 기록하려 한다.Auto Increment PK특정 데이터 식별자로 숫자를 사용하는것은 많은 이점을 가진다. 숫자를 증가시키는 것은 저장 및 정렬시 시간 순서를 반영할 수 있어 추론이 쉽다. 이에 많은 관계형 데이터베이스(RDB)에서 PK를 자동 생성할 수 있게 지원하고 있다. 대표적으로 MySQL의 PK 생성 전략중 하나인 auto_increment 속성이 가장 널리 알려져있다. 이 방식의 가장 큰 장점은 '간편하게 구현할 수 있다.. Hikari Connection Pool 최적화 하기 (with nGrinder) Connection커넥션이란 웹 어플리케이션 서버(WAS)와 데이터베이스(DB)사이의 연결을 뜻한다. 커넥션을 생성하려면 위와 그림과 같이 3-Way Handshake 과정을 거친다. 3-Way Handshake는 TCP 통신에서 클라이언트와 서버 간의 연결을 설정하기 위한 3단계 과정으로, 해당 과정이 쿼리를 요청할 때 마다 반복적으로 실행되면 네트워크 구간에서 병목의 원인이 될 수있다. MySQL 공식문서 에서는 MySQL 8.0 기준으로 INSERT문을 수행할 때 아래와 같은 비율로 비용이 발생한다고 안내한다.Connecting: (3)Sending query to server: (2)Parsing query: (2)Inserting row: (1)Inserting index: (1)Closing:.. 1000만건의 데이터를 커버링 인덱스를 사용하여 쿼리 최적화하기 사이드 프로젝트 진행중 커버링 인덱스를 사용하여 쿼리 성능을 최적화한 방법을 공유하려 합니다.쿼리 분석create table reservations( id bigint auto_increment primary key, spot_id bigint not null, head_count int not null, reservation_date datetime(6) not null, phon.. Spring JDBC Batch Insert 성능 최적화 하기 프로젝트를 진행하다보면 대량의 데이터를 삽입 및 수정해야할 때가 있다. 이 경우 사용되는 다양한 방법들과 Spring JDBC Batch Insert를 활용하여 성능 최적화를 하는 방법을 알아보자. 본 글에서는 더미 데이터 10만개를 생성하여 성능을 테스트 할 예정이며, 이를 위해 'data faker' 라이브러리를 사용하였다.https://www.datafaker.net/documentation/getting-started/JPA의 save()와 saveAll() 성능 테스트@SpringBootTestclass AdminSpotServiceTest { private final Faker faker = new Faker(new Locale("ko")); private static final I.. Loki와 Grafana를 사용하여 로그 모니터링 환경 구축하기 - 2 MSA 기반의 사이드 프로젝트를 진행하면서 여러대의 서비스 인스턴스를 관리해야 했다. 이에 여러 인스턴스들에서 발생하는 로그들을 쉽게 모니터링 하기 위해 loki와 grafana를 도입한 내용을 기록하려 한다. grafana와 관련된 설정들은 이전 글을 참고하면 된다. Loki를 선택한 이유이번 사이드 프로젝트를 진행하면서 PLG(promtail + loki + grafana) 스택을 도입하는 것이 ELK(elasticsearch + logstash + kibana) 스택 전체를 도입하는 것보다 장점이 있다고 생각했다. ELK 스택의 경우 elasticsearch의 강력한 검색 기능을 활용하여 '복잡한 쿼리 작성이나 필터링'하는데 있어 강점을 가진다. 다만 이러한 ELK의 강점이 이번 프로젝트에서 반드시.. prometheus와 grafana를 사용하여 서버 모니터링 환경 구축하기 - 1 MSA 기반의 사이드 프로젝트를 진행하면서 여러대의 서비스 인스턴스를 관리해야 했다. 이에 여러 인스턴스들을 편리하게 모니터링 하기 위해 spirng actuator와 prometheus, grafana를 도입한 내용을 기록하려 한다. spring actuator 설정하기implementation 'org.springframework.boot:spring-boot-starter-actuator'build.gradle에 spring actuator 라이브러리를 추가한다.management: endpoints: web: exposure: include: "*" # 모든 엔드포인트를 웹에 노출웹 환경에 기능들을 노출하기 위해 application.yml에 위와 같이 추가한다.doc.. Redisson 분산락을 사용해 동시성 제어하기 - 2 프로젝트를 진행하다보면 빈번하게 동시성 문제를 만나게 된다. 이에 동시성 문제를 해결하는 여러 방법들을 기록하려한다. 동시성 문제의 정의는 이전 글에 기술되어있다. 이번에는 낙관적 락과 비관적 락으로 해결하지 못한 문제를 해결할 수 있는 분산락에 대해 알아보려 한다. 분산락이란?분산락이란 분산 환경에서 여러 프로세스가 공유 자원에 동시에 접근할 때, 하나의 프로세스만 안전하게 작업할 수 있도록 제어하기 위한 동기화 기술이다. 분산락을 사용하면 락을 획득한 프로세스 혹은 스레드 만이 공유 자원에 접근할 수 있게 된다.동시성 이슈이번에 '웨이팅 프렌즈' 프로젝트를 진행하면서 고객이 예약을 하면 '예약 현황'과 '예약 번호'를 반환해주는 API가 있었다. 여기서 예약 번호가 영업 시작후 0번부터 예약이 발생할.. 이전 1 2 3 4 5 다음