【问题标题】:Disable Istio default retry strategy (at least on POST requests)禁用 Istio 默认重试策略(至少在 POST 请求上)
【发布时间】:2021-06-15 05:13:04
【问题描述】:

我有一个使用 Istio 1.7.4 在 kubernets 上运行的应用程序(基于微服务)

微服务有自己的集成失败事务补偿机制。

但是当某些集成有 503 状态码响应时,Istio 正在重试请求。我需要禁用它(至少在 POST 上,这是非同质的)。

让应用程序处理它。

但是我尝试了很多方法都没有成功。有人可以帮我吗?

【问题讨论】:

标签: kubernetes microservices istio envoyproxy istio-sidecar


【解决方案1】:

文档

重试之间的间隔(25ms+)是可变的并且是确定的 由 Istio 自动执行,防止被调用的服务被 被请求淹没。 HTTP 的默认重试行为 requests 是在返回错误之前重试两次

顺便说一句,最初是 10,但在 Enable retries for specific status codes and reduce num retries to 2 提交中减少到 2。

  • 解决方法是使用虚拟服务

您可以在虚拟环境中针对每个服务调整重试设置 服务,而无需触摸您的服务代码。你也可以 通过添加每次重试超时进一步优化您的重试行为, 指定您希望等待每次重试尝试的时间量 成功连接到服务。


示例

  1. 以下示例配置了在初始调用失败后最多 3 次重试以连接到此服务子集,每次超时时间为 2 秒。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v1
    retries:
      attempts: 3
      perTryTimeout: 2s
  1. 您的情况。禁用重试。取自Disable globally the default retry policy
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: no-retries-for-one-service
spec:
  hosts:
  - one-service.default.svc.cluster.local
  http:
  - retries:
      attempts: 0
    route:
      - destination:
          host: one-service.default.svc.cluster.local

【讨论】:

  • 感谢您的回答。我试过这个解决方案。此策略的另一个变体是更改属性(retry_on 条件和 retriable_status_codes)。我还读到 Istio 在验证此策略时存在错误,无法将属性尝试更改为零。看看这里:linklink
  • Istio 1.7.4 上似乎仍然存在该错误。但是我可以通过更改应用程序级别的状态代码响应来跳过这个默认策略。我并不为此感到自豪,但这是我在那里找到的唯一解决方案。
  • 我们在 1.11.2 版本中也面临同样的错误。虚拟服务重试尝试值 0 未到达代理配置,并且仍在使用默认值 2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-07
  • 2021-05-05
  • 1970-01-01
  • 1970-01-01
  • 2016-08-05
  • 2014-09-27
相关资源
最近更新 更多