O0oO0Oo / netty-reservation-service

트랜잭션, 동시성을 공부하기 위한 토이 프로젝트입니다.
0 stars 0 forks source link

feat: create index and jpa optimization #13

Closed O0oO0Oo closed 2 months ago

O0oO0Oo commented 4 months ago

이슈 개요

다음 설정을 통해 성능 개선

1. 인덱스 설정

멀티 모듈로 분리하면서 다음과 같은 구조가 되어 기존의 엔티티끼리의 매핑이 사라졌다.

modules : common, saga-orchestration, messaging-adapter ...

           +------ Business : 회사 ----...
           |
           +------ ReservableItem : 예약 아이템 ----...
           |
modules  <-+------ Wallet, Payment : 결제 ----...
           |
           +------ Reservation : 예약 기록 ----...
           |
           +------ User : 유저 ----...

외래키의 경우 자동적으로 인덱스가 생성되지만 위의 멀티 모듈의 경우 엔티티끼리의 매핑이 사라져 Long xxxxId 로 대체하였고, 해당 필드에 대해 인덱스를 직접 설정해야 한다.

예를 들어 유저가 예약을 할 때 이전의 예약 기록을 바탕으로 한명의 유저가 동일한 아이템에 대해 n 개 이상 구매하지 못하게 하는 기능이 있다.

이때 복합 인덱스를 {userId, itemId} 설정한다면 인덱스 레인지 스캔을 사용하여 빠르게 조회가 가능하기에 인덱스를 적절히 만드는것은 중요하다.

Grafana - table scan 인 select scan 을 줄여야 한다.

image

Grafana - 3 초 이상 걸리는 슬로우 쿼리 발생

image

Grafana - read-rnd-next : table scan 마다 증가 - 줄여야 한다.

image

2. DynamicUpdate 설정

2.1 Update 쿼리를 보고 DynamicUpdate 엔티티 클래스에 설정

3. batch insert, update 처리

3.1 Reservation 저장 시 TSID 를 사용하는 pk 를 검증하기 위해 Select 쿼리가 나가는 것

image image image

insert 는 batch 로 동작하지만, 100개를 넣을때 위의 경우 6번의 batch insert, 100 번의 reservation id 조회가 발생한다.

3.2 Update 쿼리가 배치로 동작을 안함

image image

3.3 Payment 의 batch insert 를 위한 pk 를 IDENTITY 에서 직접 생성 TSID 로 변경

image

4. 커넥션 풀 수정

41 로 이동

재현 단계

1. 인덱스 생성

Wallet 의 userId 인덱스 생성

생성 전 image 생성 후 image

Wallet 외에도 Reservation, Payment 에 인덱스 생성

Grafana 모니터링 인덱스 생성 전,

image image image

Grafana 모니터링 인덱스 생성 후

image image image

같은 10,000 의 요청을 보냈을때, full table scan 이 줄어들고 인덱스를 사용하며, slow query 가 사라졌다

2. DynamicUpdate 설정

설정 전 image image image

설정 후 image image image

3. batch insert, update

4. 커넥션 풀 수정

예상 동작

  1. 인덱스로 인한 성능 향상
  2. 설정들로 인한 최적화

실제 동작

  1. 인덱스로 인한 성능 향상
  2. 설정들로 인한 최적화

image

추가 정보