重试
重试是一种弹性模式,它使应用程序能够屏蔽客户的瞬态问题。这是通过重试因临时故障(例如 Pod 正在启动)而失败的请求来完成的。本指南描述了如何在 OSM 中实现重试策略。
配置重试
OSM 使用其 Retry policy API 允许重试从指定源 (ServiceAccount) 到一个或多个目的地 (Service) 的流量。重试仅适用于 HTTP 流量。使用 Envoy 的重试请求头,OSM 可以为参与网格的应用程序实现重试 .
支持以下重试配置:
Per Try Timeout
:重试被视为失败之前允许的时间。默认使用全局路由超时。有关更多信息,请参阅 Envoy 的文档。Retry Backoff Base Interval
:指数重试回退的基本间隔。Envoy 使用完全抖动的指数退避算法。退避是从范围 [0,(2**N-1)B] 中随机选择的,其中 N 是重试次数,B 是基本间隔。默认值为25ms
,最大间隔为基本间隔的 10 倍。参见 Envoy 的文档获取更多信息。Number of Retries
:尝试重试的最大次数。默认值为1
。Retry On
:指定何时重试失败请求的策略。可以使用,
分隔列表指定多个策略。有关更多信息以及列表支持的政策。
要了解有关配置重试的更多信息,请参阅 重试策略演示 和 API 文档。
示例
如果 bookbuyer 服务对 bookstore-v1 服务或 bookstore-v2 服务的请求收到状态码为 5xx 的响应,则 bookbuyer 将重试该请求 3 次。如果尝试重试的时间超过 3 秒,则认为尝试失败。每次重试在尝试 如上计算 之前都有一个延迟期(退避)。所有重试的退避时间上限为 10 秒。
kind: Retry
apiVersion: policy.openservicemesh.io/v1alpha1
metadata:
name: retry
spec:
source:
kind: ServiceAccount
name: bookbuyer
namespace: bookbuyer
destinations:
- kind: Service
name: bookstore
namespace: bookstore-v1
- kind: Service
name: bookstore
namespace: bookstore-v2
retryPolicy:
retryOn: "5xx"
perTryTimeout: 3s
numRetries: 3
retryBackoffBaseInterval: 1s
如果 bookbuyer 服务对 bookstore-v2 服务的请求收到状态码为 5xx 或可重试的-4xx (409) 的响应,则 bookbuyer 将重试请求 5 次。如果尝试重试的时间超过 4 秒,则认为尝试失败。每次重试在尝试 如上计算 之前都有一个延迟期(退避)。所有重试的退避时间上限为 20 毫秒。
kind: Retry
apiVersion: policy.openservicemesh.io/v1alpha1
metadata:
name: retry
spec:
source:
kind: ServiceAccount
name: bookbuyer
namespace: bookbuyer
destinations:
- kind: Service
name: bookstore
namespace: bookstore-v2
retryPolicy:
retryOn: "5xx,retriable-4xx"
perTryTimeout: 4s
numRetries: 5
retryBackoffBaseInterval: 2ms