DeliverySpec.RetryAfterMax field
Flag name: delivery-retryafter
Stage: Alpha, disabled by default
Tracking issue: #5811
Persona: Developer
When using the delivery
spec to configure event delivery parameters, you can use the retryAfterMax
field to specify how HTTP Retry-After headers are handled when calculating backoff times for retrying 429 and 503 responses. You can specify a delivery
spec for Channels, Subscriptions, Brokers, Triggers, and any other resource spec that accepts the delivery
field.
The retryAfterMax
field only takes effect if you configure the delivery
spec to perform retries, and only pertains to retry attempts on 429 and 503 response codes. The field provides an override to prevent large Retry-After durations from impacting throughput, and must be specified using the ISO 8601 format. The largest of the normal backoff duration and the Retry-After header value will be used for the subsequent retry attempt. Specifying a “zero” value of PT0S
effectively disables Retry-After support.
Prior to this feature, Knative Eventing implementations have not supported Retry-After headers, and this is an attempt to provide a path for standardizing that support. To begin, the feature is opt-in, but the final state will be opt-out as follows:
Feature Stage | Feature Flag | retryAfterMax Field Absent | retryAfterMax Field Present |
---|---|---|---|
Alpha / Beta | Disabled | Accepted by Webhook Validation & Retry-After headers NOT enforced | Rejected by WebHook Validation |
Alpha / Beta | Enabled | Accepted by Webhook Validation & Retry-After headers NOT enforced | Accepted by Webhook Validation & Retry-After headers enforced if max override > 0 |
Stable / GA | n/a | Retry-After headers enforced without max override | Retry-After headers enforced if max override > 0 |
The following example shows a Subscription that retries sending an event three times, and respects Retry-After headers while imposing a maximum backoff of 120 seconds:
apiVersion: messaging.knative.dev/v1
kind: Subscription
metadata:
name: example-subscription
namespace: example-namespace
spec:
subscriber:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: example-sink
delivery:
backoffDelay: PT2S
backoffPolicy: linear
retry: 3
retryAfterMax: PT120S
Note
While the feature flag enforces all DeliverySpec usage of the retryAfterMax
field through Webhook validation, it does not guarantee all implementations, such as Channels or Sources, actually implement support for the field. The shared HTTPMessageSender.SendWithRetries()
logic has been enhanced to support this feature, and all implementations using it to perform retries will automatically benefit. Extensions implementations not based on this shared library, for example RabbitMQ or Google Pub/Sub, would require additional development effort to respect the retryAfterMax
field.