
Timeout Pattern타임아웃 패턴
타임아웃 패턴(Timeout Pattern)은 외부 리소스 접근 시 최대 대기 시간을 설정하는 탄력성 패턴이다. 느린 응답이 스레드를 점유해 전체 시스템이 마비되는 것을 방지한다.
타임아웃 종류
1. 연결 타임아웃(Connect Timeout):
TCP 연결 수립까지 최대 대기 시간
보통 짧게 (1~5초)
2. 읽기 타임아웃(Read Timeout):
연결 후 응답 수신까지 최대 대기
비즈니스 로직에 따라 결정 (5~30초)
3. 쓰기 타임아웃(Write Timeout):
요청 본문 전송까지 최대 시간
4. 전체 요청 타임아웃(Request Timeout):
연결 + 쓰기 + 읽기 전체 제한구현 예시
typescript
// fetch API에서 AbortController로 타임아웃
async function fetchWithTimeout(
url: string,
timeoutMs: number
): Promise<Response> {
const controller = new AbortController();
const timeoutId = setTimeout(
() => controller.abort(),
timeoutMs
);
try {
const response = await fetch(url, {
signal: controller.signal
});
return response;
} catch (err) {
if ((err as Error).name === 'AbortError') {
throw new Error(`Request timed out after ${timeoutMs}ms`);
}
throw err;
} finally {
clearTimeout(timeoutId);
}
}java
// OkHttp 타임아웃
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(5, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.callTimeout(60, TimeUnit.SECONDS) // 전체 타임아웃
.build();Kubernetes 타임아웃 설정
yaml
# HTTP 프로브 타임아웃
livenessProbe:
httpGet:
path: /health
port: 8080
timeoutSeconds: 5
failureThreshold: 3
# Istio 서비스 타임아웃
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
spec:
http:
- timeout: 30s
route:
- destination:
host: payment-service타임아웃 값 설정 가이드
P99 응답 시간의 2~3배를 타임아웃으로 설정
의존성 체인 고려:
서비스A(30s) → 서비스B(20s) → DB(10s)
서비스A 타임아웃 > 서비스B 타임아웃 > DB 타임아웃
Cascading Timeout:
외부 타임아웃 > 내부 호출 타임아웃의 합