View a markdown version of this page

重试策略和死信队列 - Amazon EventBridge
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

重试策略和死信队列

当目标调用失败时, EventBridge 会重试直到达到中的RetryPolicy两个限制之一,默认为 5 次尝试或 300 秒,然后在 Amazon SQS 队列中写入一条记录。OnFailureConfiguration.Arn在创建订阅者时同时设置两者:如果没有死信队列,则会丢弃耗尽重试次数的事件,唯一的跟踪就是指标。EventsDropped

重试限制

以先达到的限制为准,交货停止。

限制Range默认
MaxRetryAttempts0 到 1855
MaxEventAgeInSeconds60 到 86,400300

默认值比自定义事件总线-经典目标的 24 小时和 185 次尝试短。依赖一天重试的迁移设计必须明确设置为 MaxEventAgeInSeconds 86,400;否则,在目标中断时间超过 5 分钟期间失败的事件将进入死信队列,而不是延迟交付。对于FIFO订阅者,只要重试,失败的事件就会阻塞其组中较晚的事件,因此较长的重试窗口会用顺序换取延迟。

死信记录

记录是 JSON 文档,而不是事件。以下示例显示了两个事件的一条记录,这些事件在一个批次中一起失败。

{ "version": "1.0", "busArn": "arn:aws:events:us-east-1:111122223333:event-busv2/orders/EXAMPLE1234567890abcdef", "subscriberArn": "arn:aws:events:us-east-1:111122223333:subscriber/large-orders/EXAMPLEabcdef1234567890", "targetArn": "arn:aws:sqs:us-east-1:111122223333:large-orders", "errorCode": "ACCESS_DENIED", "errorMessage": "The delivery role is not authorized to perform sqs:SendMessage on the target.", "exhaustedRetryCondition": "MaximumEventAgeInSeconds", "retryAttempts": 4, "failedMessages": [ { "eventId": "a1b2c3d4-...", "eventGroupId": "order-1001", "deduplicationId": null, "timestamp": "2026-09-16T18:40:12Z", "targetRequestId": "..." }, { "eventId": "e5f6a7b8-...", "eventGroupId": "order-1001", "deduplicationId": null, "timestamp": "2026-09-16T18:40:13Z", "targetRequestId": "..." } ] }

到达队列的每一次失败都要先重试:没有传送失败会跳RetryPolicy过。 EventBridge 内部的失败会被 EventBridge 无限制地重试,并且永远不会产生记录。下表列出了记录可以携带的代码。 errorMessage被截断为 1,024 个字符。

errorCode失败了什么errorMessage
CUSTOMER_VALIDATION目标 API 拒绝了请求(4xx 响应):值错误、字段缺失、正文格式错误目标 API 自己的消息
ACCESS_DENIEDEventBridge 无法担任交付角色,不允许该角色调用目标,或者目标的 Amazon KMS 密钥被拒绝访问EventBridge 无法假设role。检查该角色是否存在,以及其信任策略是否允许 EventBridge 服务主体代入该角色。 或者EventBridge 无法访问resource。检查它是否存在,以及是否允许订阅者的交付角色访问它。
RESOURCE_NOT_FOUND目标或其 Amazon KMS 密钥不存在上面的 “无法访问” 消息,或者一般消息
INPUT_TRANSFORMATION_FAILURETransformer或通用目标Input表达式抛出或没有产生任何值表达式错误
THROTTLING目标限制了通话通用消息
EXECUTION_TIMEOUT目标在内没有回应 InvocationTimeoutSeconds通用消息
REQUEST_TOO_LARGE请求超出了目标的大小限制;较低 MaxBatchSize通用消息
PARTIAL_BATCH_FAILURE目标接受了批次中的一部分,拒绝了其余部分;记录中仅failedMessages列出了被拒绝的事件通用消息
RESOURCE_CONFLICT目标报告了冲突,例如名称已在使用通用消息
KMS_INVALID_STATE目标密 Amazon KMS 钥已禁用或待删除通用消息
SFN_TYPE_NOT_SUPPORTEDREQUEST_RESPONSE与不支持同步执行的标准状态机一起使用通用消息
COMPUTE_EXECUTION_ERRORREQUEST_RESPONSE函数或执行已运行并报告错误通用消息
INVOCATION_DEPENDENCY_INTERNAL目标返回服务器错误(5xx 响应)通用消息
LOOP_DETECTED该事件或由其衍生的事件已经通过目标总线;请参阅 回路检测通用消息
INTERNAL_SERVER_ERROR拨打电话 EventBridge 时内部出现故障,但重试次数仍然耗尽通用消息

通用消息是 “投递失败”。调查时使用此记录的错误代码和请求编号,如果故障仍然存在,请联系 Su Amazon pport。 EventBridge 在传递底层消息可能暴露其他服务的内部结构的地方使用它,因此,对于这些代码,errorCode和targetRequestId是要处理的事实,以及包含已发送请求的EVENT_DELIVERY_ATTEMPT日志记录。与 Amazon SQS 消息属性(ERROR_CODE、、、、、ERROR_MESSAGESUBSCRIBER_ARNTARGET_ARN、RETRY_ATTEMPTS)相同的值到达 BUS_ARNEXHAUSTED_RETRY_CONDITION,因此使用者无需解析正文即可通过这些值进行路由。对于 FIFO 订阅者,使用 FIFO 队列作为死信队列; EventBridge 设置事件MessageGroupId中的每条记录EventGroupId,这样一个组的记录就会保持井然有序。

交付角色需要sqs:SendMessage在队列中。如果没有它,该OnFailureDestinationFailed指标就会计算每条无法写入的记录,这些事件就会丢失。

从死信队列中重新驱动事件

队列中保存的是记录,而不是事件,因此您可以通过重播公交车上的事件来重新驾驶。事件必须仍在公交车的保留期内。

  1. 阅读记录并收集所有记录failedMessages[].eventId,以及最早和最新的记录timestamp。

  2. 修复errorCode名称的原因:角色的策略、目标或表达式。

  3. 在同一条总线上创建一个具有相同目标和角色的订阅者,POINT_IN_TIME起始位置StartingPoint为最早的时间戳EndPoint且最新,并对标识符进行SYSTEM_METADATA过滤。

  4. 订阅者交付事件后,将其删除并从队列中删除记录。

aws eventsv2 create-subscriber \ --name redrive-2026-09-16 \ --event-bus-arn arn:aws:events:us-east-1:111122223333:event-busv2/orders/EXAMPLE1234567890abcdef \ --starting-position POINT_IN_TIME \ --point-in-time-configuration '{ "PointType": "TIMESTAMP", "StartingPoint": "2026-09-16T18:40:00Z", "EndPoint": "2026-09-16T18:41:00Z" }' \ --filter-configuration '{ "Filters": [ { "Scope": "SYSTEM_METADATA", "Pattern": "{\"aws:EventId\":[\"a1b2c3d4-...\",\"e5f6a7b8-...\"]}" } ] }' \ --invoke-configuration '{ "TargetArn": "arn:aws:sqs:us-east-1:111122223333:large-orders", "RoleArn": "arn:aws:iam::111122223333:role/EventBusDeliveryRole" }'

重播的事件随之而来 aws:DeliveryTypeREPLAY,因此消费者可以从实时流量中分辨出来。