Backend
[매일메일] 동기 방식으로 외부 서비스를 호출할 때 외부 서비스 장애가 나면 어떻게 조치할 수 있나요? + 동기와 비동기의 차이점은 무엇인가요?
· 8분 읽기
동기 방식으로 외부 서비스를 호출할 때 외부 서비스 장애가 나면 어떻게 조치할 수 있나요?
1. 직접 조사(구글링, 공식문서, 기술 포스팅 등으로 학습)
1) 동기 vs 비동기 통신
- 동기(Synchronous): 요청이 끝날 때까지 대기 → 직렬적 실행, 장애 전파에 취약
- 비동기(Asynchronous): 요청 후 기다리지 않고 다른 작업 수행 → 콜백·이벤트 기반, 높은 처리량
- 멀티스레딩과 비동기
- 멀티스레딩: 여러 스레드를 병렬 실행 (context switching 비용 존재)
- 비동기: Non-block I/O 기반, 적은 스레드로도 높은 성능
- 멀티스레딩과 비동기
→ 최신 추세: “스레드는 최소화, Non-block I/O로 처리량 극대화”
2) Block I/O vs Non-block I/O
- Block I/O: 작업이 완료될 때까지 멈춰서 기다림 → CPU 낭비
- Non-block I/O: 요청 후 바로 다음 작업 수행, 완료 시 이벤트·콜백으로 결과 확인 → CPU 활용 극대화
- 활용: 대규모 네트워크·파일 I/O 처리, 이벤트 기반 아키텍처(Node.js 등)
3) 아키텍처 관점의 통신
- 동기 통신: 요청-응답 구조, 직렬적 실행, 한 서비스 장애가 전체로 퍼짐
- 비동기 통신: 메시지 큐로 간접 연결, 서비스 간 결합도 낮고 장애 전파 최소화
- 결론: 상황에 맞게 동기+비동기 조합이 최적
4) 외부 서비스 장애 문제
- 외부 API 장애 → 서버 스레드·커넥션 풀·DB 커넥션 점유
- 동일 풀을 공유하는 다른 서비스까지 지연/실패
- 예시: A(결제) 장애 → B(프로필), C(주문)까지 전파
5) 장애 대응 핵심 전략
Timeout
- 요청에 시간 제한을 두어 무한 대기 방지
- Connection / Read / Pool Timeout 설정
- 효과: 빠른 실패, 자원 낭비 차단
Bulkhead
- 서비스별 자원 격리로 장애 전파 차단
- 각 API마다 커넥션 풀·스레드 풀 분리
- 효과: 특정 서비스 장애에도 다른 서비스는 정상 동작
Circuit Breaker
- 일정 실패율 이상이면 호출 차단 → 빠른 실패
- 상태 전환: Closed → Open → Half-Open
- 효과: 지속적 장애 상황에서 전체 응답 지연·처리량 감소 예방
2. 정답 확인(매일매일 해설)
3. 최종 정리
- 외부 API 장애는 서버 자원을 고갈시키고 다른 서비스까지 지연시킨다.
- 이를 막기 위한 핵심 전략은 Timeout, Bulkhead, Circuit Breaker다.
- Timeout: 무한 대기 방지, 빠른 실패 처리
- Bulkhead: 자원 격리로 장애 전파 차단
- Circuit Breaker: 반복 장애 시 호출 차단, 자동 복구
- 세 가지를 함께 적용해야 단일 장애가 전체 시스템으로 확산되는 것을 막을 수 있다.
→ 결론: 장애는 반드시 발생한다. 대비하지 않으면 시스템 전체가 무너진다.
🔗 참고 URL
- 포스팅/영상:
Q. 동기와 비동기의 차이점은 무엇인가요?
1. 직접 조사(구글링, 공식문서, 기술 포스팅 등으로 학습)
1) 동기(Synchronous) vs 비동기(Asynchronous)
- 동기
- 요청이 끝날 때까지 결과를 기다림
- 작업이 직렬적으로 실행됨
- 하나의 작업이 막히면 뒤의 작업도 지연됨
- 장애 전파에 취약
- 비동기
- 요청 후 결과를 기다리지 않고 다른 작업 수행
- 콜백, 이벤트, Future/Promise 기반 처리
- 스레드가 I/O를 기다리며 놀지 않음
- 적은 리소스로도 높은 동시성 확보 가능
2) 멀티스레딩(Multi-threading) vs 비동기(Asynchronous)
- 멀티스레딩
- 여러 개의 스레드를 동시에 실행
- CPU 코어 수에 따라 물리적 병렬 처리 가능
- 작업을 나눠 동시에 실행하는 데 유리
- 단점: 스레드 개수가 많아질수록 context switching 비용 증가
- 비동기
- Non-blocking I/O 기반으로 동작
- 스레드 수를 많이 늘리지 않고도 동시성 확보 가능
- 한 스레드가 I/O 작업을 기다리지 않고 다른 작업 처리
- 효율적이지만 구현 난도가 높음
3) 최신 추세
- 스레드 개수를 최소화하면서 Non-blocking I/O를 활용하여 처리량을 극대화하는 방식이 주류
- 대표 사례: Node.js(이벤트 루프 기반), Netty(비동기 I/O), Spring WebFlux(Reactor 기반 비동기 처리)
2. 정답 확인(매일매일 해설)
3. 최종 정리
- 동기: 요청이 끝날 때까지 기다림 → 직렬 처리, 지연 발생
- 비동기: 기다리지 않고 다른 작업 수행 → 높은 동시성 확보
- 멀티스레딩: 여러 스레드를 동시에 실행 → 병렬 처리, 스위칭 비용 큼
- 최신 추세: 스레드 최소화 + Non-blocking I/O로 처리량 극대화 (Node.js, Netty, WebFlux)
🔗 참고 URL
댓글
GitHub 계정으로 댓글을 남길 수 있어요.