超时和重试如何在 Istio 中协同工作?

How timeout and retries works together in Istio?

这里是 VirtualService 的例子,同时使用超时和重试。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: sa-logic
spec:
  hosts:
    - sa-logic
  http:
  - route: 
    - destination: 
        host: sa-logic
        subset: v1
      weight: 50
    - destination: 
        host: sa-logic
        subset: v2
      weight: 50
    timeout: 8s
    retries:
      attempts: 3
      perTryTimeout: 3s # perTryTimeout (3s) is different from timeout above (8s)

它是如何工作的?该文档没有对此问题提供明确的答案。 我有三个猜测:

  1. 超时始终为 8 秒(超时覆盖 perTryTimeout)。
  2. 超时总是 3 秒(perTryTimeout 覆盖超时)。
  3. 初始调用的超时为 8 秒,重试的超时为 3 秒(与文档相矛盾。文档说 perTryTimeout 包括初始调用和任何重试)。
  4. 每次尝试的超时始终为 3 秒(包括初始调用),但所有尝试的总超时为 8 秒。

这是正确的:

  1. Timeout per try always 3s (including initial call), but the total timeout for all attempts is 8s.

基本意思是:

  • 如果尝试时间超过 3 秒,则将其标记为失败。

  • 最多尝试 3 次。

  • 成功尝试的总等待时间不会超过 8 秒。

perTryTimeout * retries 不应超过全局 timeout。如果是,超出全局超时的重试尝试将被忽略。