728x90
반응형
아키텍쳐 리팩토링
스케일 아웃 Scale out
- AWS 로드 밸런서를 사용해 애플리케이션을 여러 서버로 분산해 트래픽을 균형있게 분배하고 고가용성을 제공하는데 도움이 된다.
분산 시스템 아키텍쳐
- 마이크로 서비스 아키텍쳐를 고려해 각 부분을 독립적으로 스케일 아웃한다. 확장성을 제공한다.
서버 리소스 최적화
- 서버 리소스 (CPU, 메모리, 디스크) 를 최적화하고 운영체제 및 웹 서버를 튜닝한다.
애플리케이션 리팩토링
캐싱 활용
- 자주 접근하는 데이터를 캐시한다. 동일한 데이터에 대한 요청이 있을 때 마다 더 빠르게 제공할 수 있다
- 캐시란? 데이터를 임시 저장하는 기술.
비동기 프로그래밍
- spring 의 비동기 서비스 및 메세징을 활용해 요청과 응답을 병렬로 처리하고 병목현상을 줄인다.
- 비동기 프로그래밍이란? 동시에 작업을 여러 개 실행하는 방식. 각 작업이 완료될 때 까지 기다리지 않고 다른 작업을 수행한다.
알고리즘 및 비즈니스 로직 최적화
- 비즈니스 로직에서 성능에 영향을 미치는 부분을 개선, 불필요한 반복 작업을 최소화한다.
데이터 베이스 리팩토링
실행 계획을 통한 쿼리 최적화
- DB 쿼리를 검토하고 복잡한 쿼리를 최적화한다. 인덱스, 조인, 서브쿼리 등을 개선해 DB 성능을 향상시킨다. db 실행 계획을 확인하고 병목 현상을 식별해 인덱스 또는 조인을 추가한다.
인덱스 최적화
- 자주 검색되는 열에 적절한 인덱스를 생성한다. 복합 인덱스를 고려해 검색 속도를 높인다.
데이터베이스 분리
- db를 읽기 전용과 쓰기 전용으로 분리해 읽기 작업에 대한 부하를 줄인다.
데이터 정규화 및 반정규화
- 정규화를 통해 중복을 최소화하고 역정규화를 통해 읽기 성능을 향상시킨다.
- 정규화가 항상 정답인 것은 아니다. 정규화를 하면 조인이 불가피한데, 데이터가 많을 수록 조인 비용이 많이 든다. 데이터가 많은 곳에선 반정규화를, 데이터가 적은 곳에선 정규화를 한다고 알고있다.
DB 리팩토링 - 적용
ALTER TABLE `board_server`.`post`
ADD INDEX `name` (`name` ASC);
post table , name에 인덱스를 추가한다.
DB 리팩토링 후 스파이크 테스트 결과 ->
[2024-11-21 15:01:14,567] Han/INFO/locust.main: Shutting down (exit code 0)
Type Name # reqs # fails | Avg Min Max Med | req/s failures/s
--------|----------------------------------------------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
POST /members/sign-in 1000 0(0.00%) | 216 30 1127 130 | 8.71 0.00
POST /search 68867 0(0.00%) | 19 1 885 12 | 599.94 0.00
--------|----------------------------------------------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
Aggregated 69867 0(0.00%) | 22 1 1127 13 | 608.65 0.00
Response time percentiles (approximated)
Type Name 50% 66% 75% 80% 90% 95% 98% 99% 99.9% 99.99% 100% # reqs
--------|--------------------------------------------------------------------------------|--------|------|------|------|------|------|------|------|------|------|------|------
POST /members/sign-in 130 160 210 260 470 1100 1100 1100 1100 1100 1100 1000
POST /search 12 16 20 22 32 56 110 130 740 850 890 68867
--------|--------------------------------------------------------------------------------|--------|------|------|------|------|------|------|------|------|------|------|------
Aggregated 13 17 20 23 35 75 120 150 880 1100 1100 69867
Endurance test ->
[2024-11-21 15:27:24,163] Han/INFO/locust.main: Shutting down (exit code 0)
Type Name
# reqs # fails | Avg Min Max Med | req/s failures/s
Aggregated 3883 0(0.00%) | 8 1 159 5 | 68.46 0.00
Response time percentiles (approximated)
Type Name 50% 66% 75% 80% 90% 95% 98% 99% 99.9% 99.99% 100% # reqs
--------|--------------------------------------------------------------------------------|--------|------|------|------|------|------|------|------|------|------|------|------
POST /members/sign-in 120 130 140 150 150 150 160 160 160 160 160 100
POST /search 5 6 6 7 8 10 13 16 30 39 39 3783
--------|--------------------------------------------------------------------------------|--------|------|------|------|------|------|------|------|------|------|------|------
Aggregated 5 6 6 7 9 12 83 130 150 160 160 3883
애플리케이션 리팩토링
- 레디스 expire.defaultTime 을 60 -> 600초로 수정
- 검색 API 서비스 로직 비동기 처리 방식 수정
- 레디스 검색 key 세분화
expire.defaultTime=36288000
@Async
@Cacheable(value = "getPosts",
key = "'getPosts' + #request.getName() + #request.getCategoryId()",
unless = "#result == null")
728x90
'JAVA > 프로젝트' 카테고리의 다른 글
스프링부트 Slack 알림 연동 (0) | 2024.11.25 |
---|---|
알림 기능 개발, AWS SNS 연동 (0) | 2024.11.21 |
성능 테스트 - Locust 설치, 이론 (1) | 2024.11.20 |
성능 테스트 진행- 테스트 종류와 툴, 진행할 시나리오 (0) | 2024.11.18 |
Spring Boot 에 Redis 설정, 캐시 적용, 조회 (1) | 2024.11.17 |