성능 개선에 대해서 주제를 잡으려면 어떤 키워드가 있을까?
•
대량 트래픽
◦
"대량 트래픽"은 주로 동시에 많은 요청이 발생하는 상황을 나타내는 용어
•
대용량 트래픽
◦
"대용량 트래픽"은 시스템이 장기간 동안에 걸쳐서 처리해야 하는 총 트래픽 양을 의미
위 두개의 키워드에 해당되는 시나리오는?
•
대량 트래픽 → 짧은시간의 급격한 사용량 부하 → 감소시킬 방안
◦
대량 트래픽 시나리오:
상황:
특정 이벤트나 캠페인으로 인해 특정 기간 동안 트래픽이 급증한 상황.
대응 전략:
로드 밸런싱: 트래픽을 여러 서버에 분산시켜 부하를 분산하고 가용성을 향상
자동 스케일링: 트래픽이 급증하면 자동으로 서버 인스턴스를 추가하여 대응하도록 설정
캐싱: 빈번하게 요청되는 데이터는 캐시에 저장하여 반복적인 계산과 데이터베이스 조회를 최소화
비동기 처리: 특히 급격한 이벤트 발생 시, 비동기 처리를 통해 요청에 대한 응답 시간을 최소화하고 서비스 안정성을 향상
•
대용량 트래픽 → DB최적화, 캐싱전략 등 필요
◦
대용량 트래픽 시나리오:
상황:
서비스가 지속적으로 성장하며 사용자 수와 트래픽이 꾸준히 증가하는 상황.
대응 전략:
수평 스케일 아웃: 서버를 추가하거나, 클라우드 서비스를 통해 리소스를 유연하게 확장
데이터베이스 최적화: 데이터베이스 인덱싱, 파티셔닝 등을 통해 대용량 데이터에 효율적으로 접근하도록 최적화
캐싱 전략 강화: 캐싱 전략을 업그레이드하고, CDN(Content Delivery Network)을 사용하여 더 빠르게 전송
비동기 및 이벤트 드리븐 아키텍처: 비동기적인 작업과 이벤트 드리븐 아키텍처를 도입하여 처리량을 향상
위 대응 전략에 사용 될 수 있는 개선용 기술 스택 조사
필수적으로 이번에 경험했으면 하는범위를 알고 싶습니다.
사용해보지 않아서 학습커브가 어느수준인지 몰라서 어느 범위까지 가능 할 지 모르겠습니다.
현실적인 학습→적용 가능성을 알고싶습니다.
Gatling - JMeter
Spring Boot Actuator - 모니터링용?
개선 기술 필요 우선순위 생각(채용공고에서 자주 보이던 키워드+위 두가지 시나리오에서 중복되는? 부분)
1. 캐싱: (MVP목표)
Redis: 메모리 기반의 Key-Value 스토어로, 캐싱, 세션 관리, 메시지 브로커 등 다양한 용도로 사용됩니다.
Memcached: 분산 메모리 객체 캐싱 시스템으로, 세션 캐싱이나 데이터베이스 결과 캐싱에 사용됩니다.
2. 데이터베이스 최적화: (MVP목표)
Elasticsearch: 검색 및 분석을 위한 분산형 데이터베이스로, 대용량 데이터에 대한 효율적인 검색을 제공합니다.
Cassandra, MongoDB: NoSQL 데이터베이스로, 수평 확장이 용이하며 대용량 데이터를 처리합니다.
3. 비동기 처리:
RabbitMQ, Apache Kafka: 메시지 브로커로서 비동기 메시지 큐 시스템을 제공하여 백그라운드 작업을 처리합니다.
Spring Boot Async: 자바 기반의 Spring Boot에서 제공하는 비동기 처리 기능을 활용합니다.
4. 자동 스케일링:
Kubernetes: 컨테이너 오케스트레이션 툴로, 서버 자동 스케일링 및 관리를 지원합니다.
Docker Swarm: 도커 컨테이너 기반의 클러스터를 구성하여 서버를 자동으로 스케일링합니다.
5. 비동기 및 이벤트 드리븐 아키텍처:
Apache Kafka: 대용량 실시간 이벤트 스트리밍을 처리하는 분산형 메시지 큐입니다.
Spring Cloud Stream, RabbitMQ: 스프링 기반의 비동기 메시지 브로커 시스템으로, 이벤트 기반 마이크로서비스 아키텍처에 활용됩니다.
6. 로드 밸런싱:
NGINX: HTTP 서버 및 리버스 프록시로서 로드 밸런싱, 캐싱, SSL 오프로딩 등을 제공합니다.
HAProxy: 고성능 로드 밸런서로 TCP 및 HTTP 기반의 애플리케이션 트래픽을 관리합니다.
7. 캐싱 전략 강화:
CDN(Content Delivery Network): 정적 콘텐츠를 전 세계적으로 분산된 서버에 캐시하여 빠르게 제공합니다.
Cloudflare, Akamai: 대표적인 CDN 서비스로, 세계 각지의 서버를 활용하여 콘텐츠를 가속화합니다.
전체적으로 성능 개선안에 대해서 공부하면서 정리하고 있는 것들
그럼 우선순위로 해보려는것은 다음과 같은 순서인데 어떻게생각해?
1. 코드최적화 - 효율적인 알고리즘 사용, 불필요한 객체 생성 제거, 반복 연산 최소화 등의 방법으로 성능 향상을 추구한다.
2. 데이터베이스 연결 - JPA의 N+1 문제, Lazy/Eager 로딩 전략, 쿼리 최적화 및 인덱스을 통해 DB연결결 성능을 향상시킬 수 있다.
3. 캐싱 - EnChache, Redis, Hazelcast 등의 도구를 활용하여 자주 사용되는 데이터나 연산 결과를 캐시한다.
4. 비동기처리 - @Async를 활용한 비동기 메서드 실행이나 WebFlux를 도입해 반응형 프로그래밍을 적용한다.
이 모든 테스트에서는 부하테스트, 성능테스트를 JMeter로 기록할거고 개선전과 개선후를 비교하려고해
우선순위와 방법등에 대해서 평가해줘
ChatGPT
좋은 계획이에요! 각 항목에 대한 우선순위와 방법을 평가해볼게요:
1.
코드 최적화:
•
우선순위: 좋은 알고리즘과 효율적인 코드는 항상 중요합니다. 그러나 현재 코드에서 병목 현상이나 성능 저하의 주요 원인이라면 우선순위를 높일 수 있습니다.
•
방법: 프로파일링 도구를 사용하여 성능 저하의 원인을 파악하고, 해당 부분을 최적화합니다. 또한 불필요한 객체 생성과 반복 연산을 최소화하면서 메모리 사용을 최적화하세요.
2.
데이터베이스 연결:
•
우선순위: 데이터베이스 연산이 많고 중요하다면 높은 우선순위를 부여할 수 있습니다.
•
방법: N+1 문제를 해결하고, 필요한 경우 Lazy 로딩 전략을 사용하며, 쿼리 최적화 및 인덱스 추가를 통해 데이터베이스 액세스를 최적화하세요.
3.
캐싱:
•
우선순위: 자주 사용되는 데이터나 연산 결과를 캐시하는 것은 성능 향상에 중요합니다. 특히, 반복적인 동일한 쿼리에 대한 성능 개선에 도움이 됩니다.
•
방법: 캐싱 라이브러리를 도입하고, 어떤 데이터를 캐시할지 신중하게 선택하여 적용하세요.
4.
비동기 처리:
•
우선순위: 프로젝트가 실시간 요구사항이 많거나 대규모 동시 요청을 처리해야 할 경우 높은 우선순위를 부여할 수 있습니다.
•
방법: @Async를 사용하여 비동기 메서드 실행이나 WebFlux를 도입하여 비동기 처리를 강화하세요. 특히, 실시간 채팅과 같은 기능에 적합한 비동기 방식을 적용하세요.
모든 변경 사항에 대해 부하테스트와 성능테스트를 진행하고 개선 전/후를 비교하는 것은 훌륭한 방법입니다. 특히 JMeter를 사용하여 테스트를 수행하면 프로젝트의 성능 향상을 명확하게 확인할 수 있을 것입니다. 방법을 하나씩 적용하면서 진행하면 프로젝트 성능을 효과적으로 개선할 수 있을 거에요!