Blog

[프로젝트 목표 설정] 성능 개선을 하려면 어떤 기술이 필요할까? 에 대한 조사

tag
팀 스터디
날짜
2023/10/09
생성 일시
2023/10/28 06:39
작성자
성능 개선에 대해서 주제를 잡으려면 어떤 키워드가 있을까?
대량 트래픽
"대량 트래픽"은 주로 동시에 많은 요청이 발생하는 상황을 나타내는 용어
대용량 트래픽
"대용량 트래픽"은 시스템이 장기간 동안에 걸쳐서 처리해야 하는 총 트래픽 양을 의미
위 두개의 키워드에 해당되는 시나리오는?
대량 트래픽 → 짧은시간의 급격한 사용량 부하 → 감소시킬 방안
대량 트래픽 시나리오: 상황: 특정 이벤트나 캠페인으로 인해 특정 기간 동안 트래픽이 급증한 상황. 대응 전략: 로드 밸런싱: 트래픽을 여러 서버에 분산시켜 부하를 분산하고 가용성을 향상 자동 스케일링: 트래픽이 급증하면 자동으로 서버 인스턴스를 추가하여 대응하도록 설정 캐싱: 빈번하게 요청되는 데이터는 캐시에 저장하여 반복적인 계산과 데이터베이스 조회를 최소화 비동기 처리: 특히 급격한 이벤트 발생 시, 비동기 처리를 통해 요청에 대한 응답 시간을 최소화하고 서비스 안정성을 향상
대용량 트래픽 → 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를 사용하여 테스트를 수행하면 프로젝트의 성능 향상을 명확하게 확인할 수 있을 것입니다. 방법을 하나씩 적용하면서 진행하면 프로젝트 성능을 효과적으로 개선할 수 있을 거에요!