Skip to content

Conversation

@minsang-alt
Copy link
Contributor

@minsang-alt minsang-alt commented Nov 20, 2024

## 코드 리뷰할 때 안봐도 되는 클래스

1. 성능테스트를 용이하게 하기 위해 JwtAuthFilter와 Spring Security 관련 인증 필터는 다 비활성화 시켰습니다.
2. Retry 어노테이션과 RetryAspect는 낙관적락으로 테스트해볼때 써보고 사용되지 않은 클래스이므로 제거하겠습니다.
3. cd, Dockerfile, docker-compose 다 넘기셔도 됩니다
4. DummyDataLoader도 마찬가지
5. ...~~

중점적으로 봐야할 클래스들

  • EpicFactory
  • IssueNumberGenerator
  • application.yml
  • application-redis.yml
  • SchedulingConfig
  • RedisConfig

해결한 부분

요약

20명의 동시 이슈 생성 요청 시 발생한 커넥션 풀 부족 문제로 발생한 데드락을 해결하고, 100명 규모의 동시 사용자 처리를 위한 성능 개선을 수행

상황

  • HikariCP 기본 설정(10개)으로 인한 데드락과 커넥션 타임아웃 발생
  • 로그 분석 결과, 이슈 생성 요청당 2개 이상의 트랜잭션(커넥션) 필요 (이슈 생성 + 이슈번호 발급)

image

  • 1000명 규모 조직 대상, 동시 사용자 100명, 30-40 TPS, 응답시간 2초 이내, 에러율 0.1% 목표

해결방안

  • Ngrinder 부하테스트로 HikariCP Pool Size와 톰캣 스레드 최적 값 (Hikari Pool size 8개, tomcat max thread 10개) 도출

image

  • 데드락 위험이 있는 REQUIRES_NEW 트랜잭션 제거로 요청 당 필요 커넥션 수를 2개에서 1개로 감소시켜 Pool Size 관리 부담을 해소
  • 해당 요청에 대한 SELECT 쿼리 EXPLAIN 확인했지만, 성능 저하 부분이 없었음
  • 이슈 생성 요청 중, 이슈 번호 생성 시 비관적 락을 사용하여, 이슈 생성 전체 트랜잭션이 끝날 때까지 해당 시퀀스 테이블에 락을 걸어서 성능저하가 일어나고 있었음

커넥션 제거 전 다이어그램

image

  • synchronized와 ReentrantLock은 다중 서버환경에서 동시성 제어가 불가능하여 부적절

  • 낙관적락으로 Retry 3번 시도하는 것은 충돌 발생이 오히려 증가되어 비관적락보다 성능저하가 일어남

  • 이슈 번호 생성 로직을 따로 트랜잭션을 분리했지만(REQUIRED_NEW) 히카리 풀 적정 개수를 찾는 게 매우 어려움

  • Redis의 atomic INCR 연산을 활용한 동시성 제어 방식 도입

    • 이슈번호를 생성한 뒤, 가공하여 이슈테이블에 저장하기 때문에, 이슈시퀀스 테이블은 일관성이 떨어져도 됨
    • Redis와 MySQL의 동기화를 위해 Write-Back 전략을 적용해, 배치프로세스로 비동기 동기화
    • 레디스 가용성 문제를 해결하기 위해 Replication 이나 클러스터중 스케일아웃은 필요없어서, Replication으로 해결 예정

결과

  • TPS 33 → 68 (106% 증가)
  • 평균 응답시간 2,944ms → 1,429ms (51% 감소)
  • 에러율 0% 달성
  • 100 VUser 동시 요청 처리 가능

image


minsang-alt and others added 28 commits November 7, 2024 23:04
* refactor: hikari pool 설정 지움 (모니터링 때문에)

* refactor: 트랜잭션 2개로 복귀 (모니터링 때문에)
* refactor: hikari pool 설정 지움 (모니터링 때문에)

* refactor: 트랜잭션 2개로 복귀 (모니터링 때문에)

* refactor: hikaripool 로그
* refactor: hikari pool 설정 지움 (모니터링 때문에)

* refactor: 트랜잭션 2개로 복귀 (모니터링 때문에)

* refactor: hikaripool 로그

* refactor: hikaripool 로그
* refactor: tomcat thread 50 그리고 hikari pool 75

* refactor: tomcat thread 최소개수도 50
* refactor: tomcat thread 50 그리고 hikari pool 75

* refactor: tomcat thread 최소개수도 50

* refactor: tomcat thread 최소개수도 100

* refactor: tomcat thread 최소개수도 100
* refactor: tomcat thread 50 그리고 hikari pool 75

* refactor: tomcat thread 최소개수도 50

* refactor: tomcat thread 최소개수도 100

* refactor: tomcat thread 최소개수도 100

* refactor: tomcat thread 200
* refactor: tomcat thread 50 그리고 hikari pool 75

* refactor: tomcat thread 최소개수도 50

* refactor: tomcat thread 최소개수도 100

* refactor: tomcat thread 최소개수도 100

* refactor: tomcat thread 200

* refactor: tomcat thread
* feat: redis issuenumber 증가

* feat: redis write-back 전략을 위해 스케줄러 추가
@minsang-alt minsang-alt added 🌱 기능추가 새로운 기능 요청입니다 🔨 리팩터링 개선사항입니다 labels Nov 20, 2024
@minsang-alt minsang-alt self-assigned this Nov 20, 2024
@github-actions
Copy link

github-actions bot commented Nov 20, 2024

Unit Test Results

46 tests   46 ✔️  2s ⏱️
24 suites    0 💤
24 files      0

Results for commit 2ff31d0.

♻️ This comment has been updated with latest results.

minsang-alt and others added 18 commits December 7, 2024 17:35
* refactor: redis replication 구성

* refactor: 이메일 비동기 처리 서비스로 변경
* feat: 멤버초대 컨트롤러, 서비스 틀 구축

* feat: UUID 초대토큰 생성

* feat: ses 서비스 도입

* feat: 이메일 초대 토큰 키-값 레디스에 저장

* feat: 이메일 초대 토큰 키-값 레디스에 저장

* feat: 비동기 적용 및 외부서비스 장애 발생 시 처리 로직 구현

* feat: 타임아웃 설정

* refactor: 이메일 스레드 개수

* refactor: 딜레이 1초는 너무 길기때문에 500ms로 줄임
* refactor: gitignore에 /mysql, /redis, .env 추가

* test: 테스트때 .env 주입

인텔리제이에서 환경변수 수동 주입이 아닌 .env파일 주입해서 환경변수 자동주입되도록 수정

* test: 테스트컨테이너 로컬에서 동작하지않은 오류 수정

* test: EpicFactory epic 생성 테스트 추가
@minsang-alt minsang-alt merged commit 67012e2 into main Feb 26, 2025
3 of 4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🔨 리팩터링 개선사항입니다 🌱 기능추가 새로운 기능 요청입니다

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants