요청 타임아웃 — 리트라이와 함께 보는 네트워크 회복력

요청 타임아웃 — 리트라이와 함께 보는 네트워크 회복력

Envoy의 요청 타임아웃을 Istio로 설정하는 방법을 보여주는 태스크예요. 타임아웃을 정해 두면 느려진 서비스가 사용자 체감을 망치지 않게 빨리 포기할 수 있어요. 이 문서에서 타임아웃뿐 아니라 애플리케이션 자체 타임아웃과의 우선순위, 리트라이까지 함께 이해할 수 있게 구성돼 있어요.

출처: Request Timeouts — Istio 공식 문서

시작하기 전에

요청 타임아웃 설정하기

HTTP 요청 타임아웃은 라우트 규칙의 timeout 필드로 지정해요. 기본적으로 타임아웃은 꺼져 있는데, 이 태스크에서는 reviews 서비스의 타임아웃을 0.5초로 재정의할 거예요. 효과를 보기 위해 ratings 서비스 호출에 인위적으로 2초 딜레이도 넣어 볼게요.

먼저 ratings 서비스를 호출하는 reviews v2로 라우팅해요.

$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v2
EOF

다음으로 ratings 서비스 호출에 2초 딜레이를 넣어요.

$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - fault:
      delay:
        percentage:
          value: 100
        fixedDelay: 2s
    route:
    - destination:
        host: ratings
        subset: v1
EOF

브라우저에서 Bookinfo URL http://$GATEWAY_URL/productpage($GATEWAY_URL은 인그레스의 External IP)를 열어요. 별점이 보이면서도 페이지를 새로고침할 때마다 2초씩 걸리는 걸 확인할 수 있어요.

이제 reviews 서비스 호출에 0.5초 타임아웃을 추가해요.

$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v2
    timeout: 0.5s
EOF

Bookinfo 페이지를 다시 새로고침하면 2초가 아니라 1초쯤에 응답이 돌아오고, reviews가 "현재 리뷰를 사용할 수 없음" 상태로 표시돼요.

무슨 일이 벌어졌나

이 태스크에서 reviews 마이크로서비스 호출의 요청 타임아웃을 0.5초로 설정했어요(기본은 꺼져 있음). reviews가 요청을 처리하면서 ratings도 호출하니, ratings 호출에 2초 딜레이를 넣어 reviews가 0.5초 안에 끝나지 못하게 만들었고, 그래서 타임아웃이 실제로 발동하는 걸 볼 수 있었어요.

결과적으로 리뷰 대신 "Sorry, product reviews are currently unavailable for this book." 메시지가 보였는데, 이는 reviews로부터 타임아웃 에러를 받았기 때문이에요.

폴트 주입 태스크를 보면 productpage 마이크로서비스도 reviews 호출에 애플리케이션 레벨 타임아웃(3초)을 갖고 있어요. 여기서는 Istio 라우트 규칙으로 타임아웃을 0.5초로 설정했는데, 만약 3초보다 큰 값(예: 4초)으로 설정했다면 더 제한적인 쪽이 우선하므로 타임아웃은 발동하지 않았을 거예요. 자세한 내용은 네트워크 회복력과 테스트 섹션에서 확인할 수 있어요.

Istio의 타임아웃은 라우트 규칙으로 재정의하는 것 외에도, 애플리케이션이 아웃바운드 요청에 x-envoy-upstream-rq-timeout-ms 헤더를 추가하면 요청 단위로도 덮어쓸 수 있어요. 이 헤더는 초가 아니라 밀리초 단위로 지정해요.

정리

적용한 라우팅 규칙을 제거해요.

$ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@

뒤이어 배울 태스크가 없다면 Bookinfo 정리 지침대로 애플리케이션을 종료해요.

더 알아보기 (Learn more)