是否可以在 Dapr 中配置弹性策略,以在 HTTP 请求为 POST 时不执行重试?例如,.NET 中的 Polly 库允许对重试和断路器策略进行细粒度配置。在 Dapr 中可以做同样的事情吗?
apiVersion: dapr.io/v1alpha1
kind: Resiliency
metadata:
name: resiliency-policy
scopes:
- shoppingbasket
spec:
policies:
retries:
operation:
policy: constant
duration: 5s
maxRetries: 3
circuitBreakers:
serviceCB:
maxRequests: 1
timeout: 30s
trip: consecutiveFailures >= 3
targets:
apps:
discount:
retry: operation
circuitBreaker: serviceCB
Dapr 是用 Golang 编写的,因此它在底层不使用 Polly。
它的触发概念略有不同:
在 其中一个 github 问题中,他们提出了以下内容:
您说得对,它会重试任何错误,包括 4xx 响应。对于弹性的初始版本,我们采取了重试次数多于不重试的方法。将来,我们可能会添加其他过滤器/场景,您可以触发重试。我知道有计划为弹性阶段 2 添加更多 CEL 级别表达式。
在提案 PR 中,您可以看到一些关于条件重试的提及:
apis:
invoke:
- match: appId == "appB"
# Nested rules: Prevent duplicative checks in rules.
# Its likely that controler-gen does not support this
# but apiextensionsv1.JSON can be used as workaround.
rules:
- match:
request.method == "GET" &&
request.metadata.count > 1000
timeout: largeResponse
retry: largeResponse
- match:
request.path == "/someOperation"
retry: someOperation
不幸的是,据我所知,第二阶段尚未发生。