일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 낙관적 락
- 백준
- 이진탐색
- JPA
- 자바
- 알고리즘
- thundering herd
- expired key
- 외부 서비스 장애
- 벌크헤드패턴
- BFS
- session인증
- 트라이 자료구조
- 다중 서버
- 타임아웃
- ddl-auto
- Stack
- 예외처리
- 슬라이스 테스트
- Entity Manager
- queue
- 캐시 스탬피드
- 베타락
- 스택
- java
- 비관적 락
- prg패턴
- id생성
- 이분탐색
- DP
- Today
- Total
Coding 01
외부 서비스 장애에 대처하는 방법 본문
동기 방식으로 외부 서비스를 호출할 때 외부 서비스 장애가 나면 어떻게 조치할 수 있을까
외부 서비스 장애로 인해 응답이 오래 걸린다고 했을 때 외부 API 응답으로 대기하는 자원들이 운영 서버 내부에 쌓이면서 성능에 악영향을 줄 수 있다. 이를 해결하기 위한 가장 기본적인 방법은 타임아웃을 설정하는 것이다.
크게 타임아웃에는 커넥션 타임아웃과 리드 타임아웃, HTTP 커넥션 풀 타임아웃이 있다.
커넥션 타임아웃(Connection Timeout)
클라이언트가 서버와 TCP 연결을 맺는 데 걸리는 최대 대기 시간을 뜻한다.
서버가 다운되었거나 네트워크 문제가 있을 때 빠르게 실패를 감지할 수 있다.
리드 타임아웃(Read Timeout)
연결이 맺어진 후, 데이터를 읽는 데 걸리는 최대 대기 시간을 뜻한다.
서버가 요청을 처리하고 응답을 보내는 전체 시간을 제한한다.
일반적으로 커넥션 타임아웃보다 길게 설정한다.
HTTP 커넥션 풀 타임아웃
커넥션 풀에서 사용 가능한 연결을 가져오는 데 걸리는 최대 대기 시간을 뜻한다.
모든 커넥션이 사용 중일 때 새로운 커넥션을 기다리는 시간이다.
커넥션 풀이 고갈되는 상황을 방지하는 것이 중요하다.
간단한 시나리오로 생각해보자.
커넥션 타임아웃 : 웹 사이트에 접속할 때 "서버에 연결할 수 없습니다." 라는 메시지가 빠르게 뜨는 상황
리드 타임아웃 : 연결은 됐지만 서버가 응답을 너무 오래 주지 않아 "요청 시간이 초과되었습니다." 상황
HTTP 커넥션 풀 타임아웃 : 많은 요청이 동시에 들어와서 "서버가 혼잡합니다. 잠시 후 다시 시도해주세요." 상황
적절한 타임아웃을 설정하면 무한정 대기하는 상황을 방지할 수 있다.
그리고 타임아웃 이외에도 다른 전략들이 있다.
벌크헤드패턴과 서킷 브레이커이다.
특정 서비스의 장애가 전체 서비스에 영향을 주는 경우 벌크헤드 패턴을 적용해 볼 수 있다.
벌크헤드패턴은 선박의 격벽에서 이름을 따왔다고 한다. 배가 침수될 때 한 구역의 피해가 다른 구역으로 퍼지는 것을 방지하는 것처럼 작동한다.
기능의 종류마다 자원의 사용을 격리하여 서비스 일부가 장애가 발생해도 전체로 전파되지 않도록 보장해준다.
외부 서비스마다 서로 다른 커넥션 풀을 사용하기 때문에 다른 서비스의 영향을 최소화 할 수 있다.
정리하자면,
리소스 분리
각 서비스나 구성요소별로 전용 리소스 풀을 할당한다.
장애 격리
한 컴포넌트의 장애가 다른 컴포넌트로 전파되는 것을 방지한다.
중요 서비스는 계속 동작 가능하도록 보장한다.
서킷 브레이커는 전기의 회로 차단기에서 이름을 따온 장애 대응 패턴이다. 오류가 지속되는 경우 일정 시간 동안 기능 실행을 차단할 수 있다. 서킷 브레이커가 빠른 실패를 도와주기 때문에 외부 서비스 장애에 의한 응답 시간 증가를 예방할 수 있다.
서킷 브레이커는 3가지 상태가 있다.
Closed(정상)상태, Open(차단)상태, Half - Open(반열림) 상태
Colsed상태는 기본 상태로, 모든 요청이 정상적으로 외부 서비스로 전달되는 상태이다.
오류 발생을 지속적으로 모니터링하고 있다.
Open상태는 일정 시간 동안 실패율이 임계치를 넘게되면 서킷이 열리게 된다.
모든 요청을 즉시 차단하게 되고 미리 정의된 풀백 응답을 반환한다.
외부 서비스 부하를 줄이고 빠른 응답을 보장한다.
Half-Open 상태는 Open상태에서 일정 시간이 지나면 전환된다.
제한된 요청만 외부 서비스로 전달하여 회복 여부를 확인한다.
성공하면 Closed상태로, 실패하면 다시 Open상태로 전환한다.
이러한 패턴들은 단독으로도 사용할 수 있지만, 보통은 조합해서 사용한다. 예를 들어
타임아웃 + 서킷 브레이커,
벌크헤드 패턴 + 서킷 브레이커,
세가지 패턴 모두
각 패턴들은 모두 각각의 장단점이 있으며, 상황에 따라 적절히 조합하여 사용하는 것이 중요하다.
특이 msa가 보편화되면서 이런 장애 대응 전략이 중요하다고 생각된다.
이런 패턴들을 적절히 사용해서 시스템 회복성을 높여보자.
'기술면접' 카테고리의 다른 글
공유 락과 베타 락에 대해서 (1) | 2024.12.21 |
---|---|
동기와 비동기 (0) | 2024.12.20 |
JPA에서의 ID생성 전략 (1) | 2024.12.15 |
동일성과 동등성 (1) | 2024.12.14 |
[N+1] fetch join 사용 시 유의점과 해결책 정리 (1) | 2024.12.08 |