MSA 환경에서 Feign Client의 성능 최적화

1. 소개

마이크로서비스 아키텍처(MSA)에서 서비스 간 통신의 성능과 안정성은 시스템의 전체적인 품질을 결정짓는 중요한 요소입니다.

Spring Cloud에서 제공하는 Feign 클라이언트는 선언적 HTTP 통신을 쉽게 구현할 수 있는 강력한 도구지만, 기본 HTTP 클라이언트인 HttpURLConnection을 사용할 경우 성능 저하가 발생할 수 있습니다.

이번 글에서는 HttpURLConnection의 주요 문제점을 분석하고, Apache HttpComponents 5를 대안으로 적용했을 때의 성능 개선 효과를 비교해보겠습니다.

2. 테스트 환경

  • Spring Boot 버전: 3.1.0
  • Spring Cloud 버전: 2022.0.x (Kilburn)
  • Java 버전: JDK 19
  • 테스트 조건
    • 동시 사용자: 100명
    • 테스트 시간: 120초
    • 부하 패턴: 일정 부하(Constant Load)
  • 지연시간 비교
구분Java HttpURLConnectionApache HttpComponents 5
(DEFAULT)
1. max-connections-per-route: 2
2. max-connections: 20
Apache HttpComponents 5
1. max-connections-per-route: 100
2. max-connections: 100
http_req_duration394.44ms, 20.85s, 65.61ms,
25.18ms, 237.75ms (평균)
41.92ms, 353.00ms, 32.53ms,
11.34ms, 62.89ms (평균)
31.74ms, 378.38ms, 24.71ms,
8.81ms, 47.05ms (평균)
응답 시간의 변동성응답 시간의 변동성이 매우 큼
(20ms에서 394ms까지 큰 편차)
첫 번째보다는 안정적이지만
여전히 편차 존재
(11ms에서 353ms)
전반적으로 가장 안정적인 패턴
그래프 패턴 양상그래프가 매우 불안정하며
스파이크가 자주 발생
Blocked time이 16.18ms로
connection pool 대기 시간 발생
Blocked time이 50.67ms로 증가했
지만, 전체적인 처리량은 더 안정적
  • 리소스 사용률 비교
구분Java HttpURLConnectionApache HttpComponents 5
1. max-connections-per-route: 100
2. max-connections: 100
CPU 사용률CPU 스파이크가 높고(최대 50-60%), 변동이 심함CPU 사용이 더 안정적(약 20% 수준 유지)하고
예측 가능한 패턴
Heap 메모리크기: 1,358,954,528 B (약 1.3GB)
GC 활동이 더 빈번함
크기: 415,236,128 B (약 415MB)
GC 활동이 덜 빈번함
스레드Live: 26 (peak: 204)
Daemon: 23
Live: 47 (peak: 140)
Daemon: 42

3. HttpURLConnection의 한계

3.1 주요 문제점

1) 비효율적인 커넥션 관리

  • 매 요청마다 새로운 연결을 생성하여 성능 저하 발생
  • Keep-Alive 설정이 제한적이며 커넥션 풀링을 지원하지 않음
  • 단순한 캐싱 방식으로 인해 커넥션 재사용이 어려움

2) 동시성 제어의 한계

  • 단일 전역 락(Global Lock) 사용으로 인해 병목 발생
  • 중첩된 락킹 구조로 인해 성능 저하
  • 스레드 간 경합 증가로 대기 시간 증가

3) 리소스 사용의 비효율성

  • CPU 사용률이 50-60%까지 급증 (스파이크 현상)
  • 메모리 사용량 증가 (약 1.3GB)
  • GC(Garbage Collection) 활동 빈번하게 발생

3.2 성능 영향

항목HttpURLConnection
커넥션 생성 오버헤드TCP 3-way Handshake: 2-5ms,
SSL/TLS Handshake: 5-15ms,
총 연결 시간: 7-20ms
평균 응답 시간394.44ms
최대 응답 시간20.85s
응답 시간 변동성매우 높음

4. Apache HttpComponents 5 도입

4.1 주요 개선사항

1) 효율적인 커넥션 풀 관리

@Configuration
public class HttpClientConfig {
    @Bean
    public HttpClient5FeignConfiguration httpClient5Config() {
        return new HttpClient5FeignConfiguration(
            maxConnTotal = 100,
            maxConnPerRoute = 100,
            timeToLive = Duration.ofMinutes(5)
        );
    }
}

2) 최적화된 설정

spring:
  cloud:
    openfeign:
      httpclient:
        hc5:
          enabled: true
          max-connections: 100
          max-connections-per-route: 100
          connection-timeout: 2000
          connection-timer-repeat: 3000

4.2 성능 개선 결과

항목Apache HttpComponents 5
평균 응답 시간31.74ms (87% 감소)
최대 응답 시간378.38ms (98% 감소)
응답 시간 변동성안정적
CPU 사용률20% 수준으로 감소
메모리 사용량415MB (69% 감소)
GC 활동빈도 감소

커넥션 재사용 효과

  • Handshake 오버헤드 최소화
  • 커넥션 풀을 통한 효율적인 리소스 관리
  • 안정적인 처리량 유지

5. 모니터링 및 튜닝 포인트

5.1 주요 모니터링 지표

  • Connection Pool 사용률
  • 응답 시간 분포
  • Thread Pool 상태
  • GC 활동

5.2 튜닝 파라미터

feign:
  client:
    config:
      default:
        connectTimeout: 2000
        readTimeout: 3000
        loggerLevel: BASIC

6. 결론

Apache HttpComponents 5로 전환하면 다음과 같은 장점을 얻을 수 있다라고 합니다..

  1. 안정적인 성능과 예측 가능한 응답 시간
  2. 효율적인 리소스 사용
  3. 향상된 확장성과 신뢰성

MSA 환경에서 높은 부하를 처리하는 시스템을 운영할 경우, Feign 클라이언트의 기본 HTTP 클라이언트인 HttpURLConnection을 그대로 사용하기보다는 Apache HttpComponents 5를 적용하는 것을 권장한다고 합니다.

7. 느낀점

이번 분석을 통해 Feign 클라이언트의 기본 HTTP 클라이언트인 HttpURLConnection이 성능과 안정성 측면에서 여러 한계를 가지고 있음을 확인할 수 있었습니다.

특히, 비효율적인 커넥션 관리, 동시성 제어 부족, 높은 리소스 사용률이 주요 문제점으로 작용하며, 대량의 요청을 처리하는 MSA 환경에서는 성능 저하로 이어질 가능성이 높다고 생각이듭니다.

반면, Apache HttpComponents 5를 적용했을 때 평균 응답 시간이 87% 감소하고, 최대 응답 시간이 98% 감소하는 등, 성능 향상이 상당히 뚜렷하게 나타났습니다.

이는 커넥션 풀을 활용한 효율적인 리소스 관리와 최적화된 요청 처리 방식 덕분이며, 높은 트래픽을 처리하는 마이크로서비스 환경에서 특히 유용할 것으로 보입니다.

이 글을 통해 Feign 클라이언트의 HTTP 클라이언트 선택이 시스템 성능에 큰 영향을 미친다는 점을 다시 한번 깨달았습니다.

단순히 기본 설정을 유지하기보다는, 시스템의 특성과 트래픽 패턴을 고려한 최적화 전략을 적용하는 것이 중요하며, 이를 위해 다양한 HTTP 클라이언트를 비교하고 적절한 튜닝을 수행하는 과정이 필수적임을 느꼈습니다.

앞으로 MSA 환경을 구축하거나 성능 최적화를 고민할 때, Apache HttpComponents 5와 같은 효율적인 HTTP 클라이언트를 적극 활용해야겠다는 생각이 들었습니다.

추가적으로, 모니터링을 통해 성능 개선 효과를 지속적으로 분석하고, 튜닝 포인트를 찾아 최적의 환경을 유지하는 노력도 중요할 것이라 생각됩니다.

profile
에러가 나도 괜찮아 — 그건 내가 배우고 있다는 증거야.

0개의 댓글