深入探究AWSLambda异步事件源错误处理与扩展机制
立即解锁
发布时间: 2025-09-09 00:24:09 阅读量: 11 订阅数: 20 AIGC 


掌握Java无服务器开发
### 深入探究AWS Lambda异步事件源错误处理与扩展机制
#### 1. 异步事件源错误处理
##### 1.1 重试机制
首先,我们来看一段示例代码:
```java
package book;
import com.amazonaws.services.lambda.runtime.events.S3Event;
public class S3ErroringLambda {
public void handler(S3Event event) {
System.out.println("Received new S3 event");
throw new RuntimeException("This function unable to process S3 Events");
}
}
```
当我们将这个函数与S3存储桶关联,并上传文件到该存储桶时,Lambda会尝试处理S3事件三次。第一次在20:44:00,大约一分钟后进行第二次尝试,再过大约两分钟进行第三次尝试。这是Lambda为异步事件源承诺的总共三次处理尝试。
我们可以使用单独的CloudFormation资源来配置Lambda的重试次数,例如,配置SingleEventLambda函数不进行任何重试:
```yaml
SingleEventInvokeConfig:
Type: AWS::Lambda::EventInvokeConfig
Properties:
FunctionName: !Ref SingleEventLambda
Qualifier: "$LATEST"
MaximumRetryAttempts: 0
```
如果不做进一步更改,在所有重试(如果有)完成后,Lambda将不再做任何处理,原始事件的简要数据将被记录,但最终会被丢弃。
##### 1.2 死信队列(DLQ)
Lambda提供了将所有重试失败的异步事件自动转发到死信队列(DLQ)的功能,DLQ可以是SNS主题或SQS队列。以下是一个包含DLQ和DLQ监听器的SAM模板示例:
```yaml
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Description: chapter8-s3-errors
Resources:
DLQ:
Type: AWS::SNS::Topic
ErrorTriggeringBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub ${AWS::AccountId}-${AWS::Region}-errortrigger
S3ErroringLambda:
Type: AWS::Serverless::Function
Properties:
Runtime: java8
MemorySize: 512
Handler: book.S3ErroringLambda::handler
CodeUri: target/lambda.zip
DeadLetterQueue:
Type: SNS
TargetArn: !Ref DLQ
Events:
S3Event:
Type: S3
Properties:
Bucket: !Ref ErrorTriggeringBucket
Events: s3:ObjectCreated:*
DLQProcessingLambda:
Type: AWS::Serverless::Function
Properties:
Runtime: java8
MemorySize: 512
Handler: book.DLQProcessingLambda::handler
CodeUri: target/lambda.zip
Events:
SnsEvent:
Type: SNS
Properties:
Topic: !Ref DLQ
```
在这个模板中,我们定义了自己的SNS主题作为DLQ,在应用函数(S3ErroringLambda)中告诉Lambda我们需要一个DLQ,并将DLQ消息发送到我们创建的主题。同时,我们还定义了一个单独的函数(DLQProcessingLambda),由发送到DLQ的事件触发。
DLQProcessingLambda的代码如下:
```java
package book;
import com.amazonaws.services.lambda.runtime.events.SNSEvent;
public class DLQProcessingLambda {
public void handler(SNSEvent event) {
event.getRecords().forEach(snsRecord ->
System.out.println("Received DLQ event: " + snsRecord.toString())
);
}
}
```
当我们上传文件到S3时,在对S3ErroringLambda进行最终交付尝试后,DLQProcessingLambda的日志中会显示接收到的DLQ事件,该事件包含失败的原始完整事件以及原始事件的RequestID,方便我们查找问题。
##### 1.3 目标(Destinations)
2019年底,AWS引入了一种替代DLQ的捕获失败事件的功能:目标(Destinations)。Destinations比DLQ更强大,因为它可以捕获失败和成功处理的异步事件,并且支持更多类型的目标,如SNS、SQS、另一个Lambda函数或EventBridge。
以下是一个使用Destination替代DLQ的示例:
```yaml
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Description: chapter8-s3-errors
Resources:
ErrorTriggeringBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub ${AWS::AccountId}-${AWS::Region}-errortrigger
S3ErroringLambda:
Type: AWS::Serverless::Function
Properties:
Runtime: java8
MemorySize: 512
Handler: book.S3ErroringLambda::handler
CodeUri: target/lambda.zip
Events:
S3Event:
Type: S3
Properties:
Bucket: !Ref ErrorTriggeringBucket
Events: s3:ObjectCreated:*
Policies:
- LambdaInvokePolicy:
FunctionName: !Ref ErrorProcessingLambda
ErrorProcessingL
```
0
0
复制全文
相关推荐









