Home 주니어 백엔드 개발자가 반드시 알아야 할 지식 - 4장
Post
Cancel

주니어 백엔드 개발자가 반드시 알아야 할 지식 - 4장

  • 💡해당 게시글은 최범균님의 ‘주니어 백엔드 개발자가 반드시 알아야 할 지식’을 개인 공부목적으로 메모함



4장에서 다루는 내용

  • 외부 연동 문제
  • 타임아웃과 재시도
  • 동시 요청 제한과 서킷 브레이커
  • DB와 외부 연동
  • HTTP 커넥션 풀
  • 이중화



외부 연동과 장애 전파

외부 연동의 중요성

  • 현대 마이크로서비스 환경에서 외부 시스템 연동은 서버 개발의 필수 요소임
  • 내부 서비스 간 호출 및 서드파티 API 연동이 복잡해지면서 장애 발생 가능성이 증가함
  • 외부 연동 품질에 주의를 기울이지 않을 경우 전체 서비스 가용성에 지대한 영향을 끼침

장애 전파 메커니즘

  • 연동된 메타데이터 API 서비스가 느려지면 이를 호출하는 스트리밍 서비스의 스레드 점유 시간이 길어짐
  • 톰캣(Tomcat) 스레드 풀(기본 200개)이 급격히 고갈되어 서비스 자체가 마비됨
  • 한 지점의 장애가 도미노처럼 번지는 현상을 방어해야 함

장애 전파 메커니즘



타임아웃과 재시도

타임아웃

  • 연결 타임아웃 (Connection Timeout)

    • 서버와 네트워크 연결을 맺는 시점에 적용되는 대기 시간
    • 3~5초 범위 설정이 권장되며 초과 시 즉시 에러를 발생시킴

    연결 타임아웃 발생 지점

  • 읽기 타임아웃 (Read Timeout)

    • 연결 성공 후 응답을 기다리는 대기 시간
    • 서비스 특성에 따라 5~30초 정도로 설정하며 유연하게 운용할 수 있음

      읽기 타임아웃 발생 지점

재시도(Retry) 가능 조건과 주의사항

  • 재시도 가능 조건
    • 내역 조회 같은 단순 조회 기능
    • 연결 타임아웃 발생 상황
    • 멱등성(Idempotent)을 가진 변경 기능
  • 재시도 안티패턴
    • 연동 서버 부하 시 무차별적인 재시도는 장애를 심화 시킴
    • 재시도 간격을 두고 점진적으로 늘려 서버 부하를 분산해야 함
    • 잘못된 파라미터 전달 같은 검증 실패 케이스는 재시도 대상에서 제외해야 함

재시도 백오프 흐름



동시 요청 제한과 서킷 브레이커

동시 요청 제한

  • 외부 서비스의 성능 한계를 고려하여 동시에 보낼 수 있는 요청 수를 제한해야 함
  • 특정 메타데이터 조회 지연이 전체 스트리밍 시스템의 자원 고갈로 이어지는 것을 방지해야 함
  • 요청 한도 초과 시 503 Service Unavailable 응답 등을 통해 빠른 실패를 유도해야 함

서킷 브레이커

  • 전기 회로 차단기처럼 장애 상황 감지 시 요청을 즉시 차단하는 패턴임
  • 상태 변화
    • 닫힘(Closed)
      • 모든 요청 정상 전달
    • 열림(Open)
      • 장애 임계치 도달 시 요청 차단
      • 요청 차단 시 즉시 에러 응답을 반환함
    • 반열림(Half-Open)
      • 일정 시간 경과 후 일부 요청만 보내 상태 확인
      • 확인 결과에 따라 닫힘 또는 열림 상태로 전환함
  • 무의미한 대기 시간을 줄여 가용 리소스를 확보하는 주요 기법임

서킷 브레이커 상태 변화



DB와 외부 연동

외부 연동 지연과 DB 커넥션 점유 문제

  • DB 트랜잭션 범위 내에서 외부 연동을 수행할 때 발생하는 리소스 고갈 현상임
  • 이슈 예시

    • DB 커넥션 확보 후 예약 데이터를 저장하는 첫 번째 쿼리 실행
    • 이후 외부 채널 매니저 API와 연동하며 긴 응답 대기 발생
    • 응답 성공 후 예약 상태를 업데이트하는 두 번째 쿼리 실행 및 트랜잭션 완료
    • 실제 DB 작업 시간보다 외부 연동 대기 시간 동안 커넥션 점유가 지속됨

      트랜잭션과 외부 호출 흐름

  • 트래픽이 몰리는 상황에서 외부 연동 지연은 전체 시스템 마비의 결정적 원인이 됨

해결 전략 1 - DB 커넥션 획득 전 외부 호출

전략 1 커넥션 획득 전 호출

  • DB 커넥션을 점유하기 전에 외부 API 연동을 먼저 수행한 뒤 결과를 가지고 트랜잭션을 시작하는 방식임
  • 장점
    • 외부 연동 지연 시간이 길어져도 DB 커넥션 풀 고갈을 원천적으로 방지하여 시스템 가용성을 높임
  • 주의사항
    • 외부 연동 호출은 성공했으나 이후 DB 트랜잭션 도중 예외가 발생할 경우 이미 실행된 외부 작업을 수동으로 취소해야 함

해결 전략 2 - DB 커넥션 반납 후 외부 호출

전략 2 커넥션 반납 후 호출

  • DB 트랜잭션을 모두 완료하고 커넥션을 반납한 뒤에 마지막 단계에서 외부 API를 호출하는 방식임
  • 장점
    • DB 작업의 성공 여부를 확정 지은 후 외부 연동을 진행하므로 불필요한 연동 호출을 줄일 수 있음
  • 주의사항
    • 외부 연동 실패 시 이미 커밋된 DB 데이터를 되돌리는 로직이 트랜잭션으로 묶이지 않아 보상 트랜잭션 구현이 필수적임

해결 전략 3 - 데이터 일관성 확보를 위한 후처리

보상 트랜잭션 흐름

  • 보상 트랜잭션
    • 연동 실패 시 DB 데이터를 이전 상태로 되돌리는 전용 API(예 예약 취소 API)를 수동으로 호출함
  • 데이터 보정 배치
    • 연동 과정의 누락이나 오류를 대비하여 일정 주기마다 양쪽 시스템의 데이터를 대조하고 일치시키는 프로세스를 구축해야 함
  • 상태 관리
    • 외부 연동 성공 여부를 조회하는 전용 API를 활용하여 예약 상태의 최종 정합성을 주기적으로 확인해야 함



HTTP 커넥션 풀 최적화

  • HTTP 연결 역시 생성 비용이 크므로 미리 풀(Pool)을 만들어 재사용함

    커넥션 풀 개념도

  • 설정 시 고려 요소

    • 풀 크기
      • 연동 서비스의 처리 능력과 트래픽 양을 고려하여 결정함
    • 대기 시간 한계
      • 커넥션을 확보할 때까지 대기하는 최대 시간 설정임
      • 보통 1~5초 사이의 짧은 시간 설정을 권장함
      • 너무 짧으면(0.1초) 일시적 트래픽 증가에도 에러가 발생하며 너무 길면(10초) 전체 응답 시간이 지연됨
    • Keep-Alive
      • 연결을 유지할 시간을 적절히 설정하여 연결 효율을 높임
      • 서버의 유효 시간보다 짧게 설정하여 끊긴 연결 사용을 방지해야 함



서비스 이중화와 가용성

장애 대응을 위한 이중화

서비스 이중화 흐름

  • 외부 인증이나 본인 확인 등 중요 기능은 서비스 이중화를 통해 장애 발생 시 대체 경로를 확보할 수 있음
  • 한 곳의 연동 시스템이 마비되어도 다른 채널을 통해 서비스 지속 가능성을 높일 수 있음

이중화 결정 기준

  • 해당 기능이 서비스 중단 시 큰 손실을 초래하는 중요 기능인지 판단해야 함
  • 이중화 구축 및 유지 비용이 장애 시 손실 비용보다 합리적인지 검토해야 함



배운 점

  • 외부 연동은 전체 시스템 장애의 발단이 될 수 있음을 인지함
  • 톰캣 스레드 풀 고갈과 장애 전파 메커니즘을 이해함
  • 연결 타임아웃과 읽기 타임아웃의 차이와 적절한 설정 범위를 배움
  • 멱등성과 재시도 폭풍 방지의 중요성을 파악함
  • 벌크헤드 패턴과 서킷 브레이커를 통한 리소스 보호 기법을 익힘
  • DB 트랜잭션 내 외부 호출이 커넥션 풀에 미치는 치명적 영향을 이해함
  • 커넥션 획득 전후 외부 호출 배치 전략의 중요성을 배움
  • HTTP 커넥션 풀 설정 요소와 최적화 방안을 파악함
  • 서비스 이중화를 통한 가용성 확보 전략을 배움



적용 방안

  • 연동 타임아웃 설정 전수 점검 및 최적화
    • 연결 타임아웃 3~5초 범위 설정
    • 읽기 타임아웃 5~30초 가이드 준수
  • 재시도 로직 멱등성 검토 및 백오프 적용
    • 단순 조회 및 연결 실패 케이스 위주 재시도 적용
    • 지수 백오프 등을 활용한 재시도 Storm 방지
  • 중요 외부 연동 지점에 서킷 브레이커 도입
    • 장애 임계치 모니터링 및 상태 전이 자동화
    • 빠른 실패 응답을 통한 시스템 자원 보호
  • 트랜잭션 범위 내 외부 호출 제거 및 위치 조정
    • DB 커넥션 점유 전후로 외부 API 호출 이동
    • 연동 실패 시 보상 트랜잭션 및 데이터 후보정 배치 구축
  • HTTP 커넥션 풀 최적화 및 모니터링
    • 연동 서비스 성능 고려한 풀 크기 설정
    • 서버 Keep-Alive 시간 고려한 유효 시간 설정
  • 중요 서비스 이중화 검토
    • 외부 인증과 본인 확인 등 필수 기능 대체 경로 확보
    • 비용 대비 장애 리스크 평가를 통한 우선순위 산정



Reference

Contents

투 포인터 알고리즘

김영한의 실전 자바 - 객체 지향 프로그래밍