AWS 无服务器事件驱动架构 (EDA)

aws-serverless-eda
分类编程
作者Agentic Awesome Skills 社区
许可MIT
评分4.30/5
使用16.0K

AWS Serverless 与事件驱动架构

本技能基于 Well-Architected 框架原则,为在 AWS 上构建 Serverless 应用和事件驱动架构提供全面指导。

AWS 文档要求

在回答之前,请务必使用 MCP 工具(mcp__aws-mcp__*mcp__*awsdocs*__*)验证 AWS 相关事实。aws-mcp-setup 依赖项会自动加载 —— 如果 MCP 工具不可用,请引导用户完成该技能的设置流程。

Serverless MCP 服务器

本技能利用 CDK MCP 服务器(通过 aws-cdk-development 依赖提供)和 AWS Documentation MCP 来提供 Serverless 指导。

> 注意:以下 AWS MCP 服务器可通过 Full AWS MCP Server(参见 aws-mcp-setup 技能)单独获取,未包含在本插件中:
> - AWS Serverless MCP — SAM CLI 生命周期(初始化、部署、本地测试)
> - AWS Lambda Tool MCP — 直接调用 Lambda
> - AWS Step Functions MCP — 工作流编排
> - Amazon SNS/SQS MCP — 消息与队列管理

何时使用此技能

在以下场景中使用此技能:

  • 使用 Lambda 构建 Serverless 应用

  • 设计事件驱动架构

  • 实现微服务模式

  • 创建异步处理工作流

  • 编排多服务事务

  • 构建实时数据处理流水线

  • 为分布式事务实现 Saga 模式

  • 进行可扩展性和弹性设计

AWS Well-Architected Serverless 设计原则

1. 快速、简单、单一 (Speedy, Simple, Singular)

函数应简洁且职责单一

typescript
// ✅ 推荐 - 职责单一,功能聚焦
export const processOrder = async (event: OrderEvent) => {
  // 仅处理订单处理逻辑
  const order = await validateOrder(event);
  await saveOrder(order);
  await publishOrderCreatedEvent(order);
  return { statusCode: 200, body: JSON.stringify({ orderId: order.id }) };
};

// ❌ 不推荐 - 函数承担过多职责
export const handleEverything = async (event: any) => {
// 同时处理订单、库存、支付、物流...
// 职责过于繁重
};

保持函数在环境效率和成本意识方面优化

  • 尽量减少冷启动时间

  • 优化内存分配

  • 仅在必要时使用预留并发 (Provisioned Concurrency)

  • 利用连接复用

2. 关注并发请求,而非总请求量

针对并发设计,而非针对总量设计

Lambda 是水平扩展的 —— 设计考量应集中在:

  • 并发执行限制

  • 下游服务的节流 (Throttling)

  • 共享资源竞争

  • 连接池大小

typescript
// 考虑并发 Lambda 执行访问 DynamoDB 的情况
const table = new dynamodb.Table(this, 'Table', {
  billingMode: dynamodb.BillingMode.PAY_PER_REQUEST, // 根据负载自动扩展
});

// 或使用预置容量 + 自动扩展
const table = new dynamodb.Table(this, 'Table', {
billingMode:


dynamodb.BillingMode.PROVISIONED,
readCapacity: 5,
writeCapacity: 5,
});

// 为并发负载启用自动扩缩容
table.autoScaleReadCapacity({ minCapacity: 5, maxCapacity: 100 });
table.autoScaleWriteCapacity({ minCapacity: 5, maxCapacity: 100 });

code
### 3. 无共享架构 (Share Nothing)

函数运行时环境是短寿命的

typescript
// ❌ 错误 - 依赖本地文件系统
export const handler = async (event: any) => {
fs.writeFileSync('/tmp/data.json', JSON.stringify(data)); // 执行后将丢失
};

// ✅ 正确 - 使用持久化存储
export const handler = async (event: any) => {
await s3.putObject({
Bucket: process.env.BUCKET_NAME,
Key: 'data.json',
Body: JSON.stringify(data),
});
};

code
状态管理
  • 使用 DynamoDB 管理持久化状态

  • 使用 Step Functions 管理工作流状态

  • 使用 ElastiCache 管理会话状态

  • 使用 S3 进行文件存储

4. 假设无硬件亲和性 (Assume No Hardware Affinity)

应用程序必须与硬件无关

基础设施可能会在无通知的情况下发生变化:

  • Lambda 函数可能会在不同的硬件上运行

  • 容器实例可能会被替换

  • 不要对底层基础设施做任何假设

为可移植性而设计

  • 使用环境变量进行配置

  • 避免硬件特定的优化

  • 在不同环境中进行测试

5. 使用状态机编排,而非函数链

使用 Step Functions 进行编排

typescript
// ❌ 错误 - Lambda 函数链
export const handler1 = async (event: any) => {
const result = await processStep1(event);
await lambda.invoke({
FunctionName: 'handler2',
Payload: JSON.stringify(result),
});
};

// ✅ 正确 - Step Functions 编排
const stateMachine = new stepfunctions.StateMachine(this, 'OrderWorkflow', {
definition: stepfunctions.Chain
.start(validateOrder)
.next(processPayment)
.next(shipOrder)
.next(sendConfirmation),
});

code
Step Functions 的优势
  • 可视化工作流表示

  • 内置错误处理和重试机制

  • 执行历史记录与调试

  • 支持并行和顺序执行

  • 无需代码即可实现服务集成

6. 使用事件触发事务

优先选择事件驱动,而非同步请求/响应

typescript
// 模式:事件驱动处理
const bucket = new s3.Bucket(this, 'DataBucket');

bucket.addEventNotification(
s3.EventType.OBJECT_CREATED,
new s3n.LambdaDestination(processFunction),
{ prefix: 'uploads/' }
);

// 模式:EventBridge 集成
const rule = new events.Rule(this, 'OrderRule', {
eventPattern: {
source: ['orders'],
detailType: ['OrderPlaced'],
},
});

rule.addTarget(new targets.LambdaFunction(processOrderFunction));

code
优势
  • 服务间解耦

  • 异步处理

  • 更强的容错能力

  • 独立扩缩容

7. 为失败和重复设计

操作必须具备幂等性

typescript
// ✅ 正确 - 幂等操作
export const handler = async (event: SQSEvent) => {
for (const record of event.Records) {
const orderId = JSON.parse(record.body).orderId;

// 检查是否已处理(幂等性)
const existing = await dynamodb.getItem({
TableName: process.env.TABLE_NAME,
Key: { orderId },
});

if (existing.Item) {
console.log('订单已处理:', orderId);
continue; // 跳过重复项
}

// 处理订单
await processOrder(orderId);

// 标记为已处理
await dynamodb.putItem({
Tabl
eName: process.env.TABLE_NAME,
Item: { orderId, processedAt: Date.now() },
});
}
};

code
实现带有指数退避的重试逻辑
typescript
async function withRetry<T>(fn: () => Promise<T>, maxRetries = 3): Promise<T> {
for (let i = 0; i < maxRetries; i++) {
try {
return await fn();
} catch (error) {
if (i === maxRetries - 1) throw error;
await new Promise(resolve => setTimeout(resolve, Math.pow(2, i) * 1000));
}
}
throw new Error('Max retries exceeded');
}
code
## 架构模式

有关包含完整代码示例的详细实现模式,请参阅参考文档:

事件驱动架构模式

文件references/eda-patterns.md
  • 基于 EventBridge 的事件路由(自定义事件总线、架构注册表、基于规则的路由)
  • 基于 SQS 的队列处理(标准/FIFO、DLQ、Lambda 消费者)
  • 基于 SNS + SQS 的发布/订阅扇出(多消费者、过滤)
  • 基于 Step Functions 的 Saga 模式(分布式事务、补偿操作)
  • 基于 DynamoDB Streams 的事件溯源(仅追加事件存储、投影)

Serverless 架构模式

文件references/serverless-patterns.md
  • API 驱动的微服务(REST API + Lambda 后端)
  • 基于 Kinesis 的流处理(实时、批处理窗口、错误时二分法)
  • 基于 SQS 的异步任务处理(后台作业、并发控制)
  • 基于 EventBridge 的定时任务(cron/rate 调度)
  • Webhook 处理(签名验证、异步队列转发)

> 重要提示:在使用参考文档中的 CDK 代码示例时,避免硬编码资源名称(例如 restApiNameeventBusName)。让 CDK 自动生成唯一名称,以提高可重用性和支持并行部署。详见 aws-cdk-development 技能。

最佳实践

错误处理

实现全面的错误处理

typescript
export const handler = async (event: SQSEvent) => {
const failures: SQSBatchItemFailure[] = [];

for (const record of event.Records) {
try {
await processRecord(record);
} catch (error) {
console.error('Failed to process record:', record.messageId, error);
failures.push({ itemIdentifier: record.messageId });
}
}

// 返回部分批次失败以进行重试
return { batchItemFailures: failures };
};

code
### 死信队列 (DLQ)

始终为错误处理配置 DLQ

typescript
const dlq = new sqs.Queue(this, 'DLQ', {
retentionPeriod: Duration.days(14),
});

const queue = new sqs.Queue(this, 'Queue', {
deadLetterQueue: {
queue: dlq,
maxReceiveCount: 3,
},
});

// 监控 DLQ 深度
new cloudwatch.Alarm(this, 'DLQAlarm', {
metric: dlq.metricApproximateNumberOfMessagesVisible(),
threshold: 1,
evaluationPeriods: 1,
alarmDescription: 'Messages in DLQ require attention',
});

code
### 可观测性

启用追踪和监控

typescript
new NodejsFunction(this, 'Function', {
entry: 'src/handler.ts',
tracing: lambda.Tracing.ACTIVE, // X-Ray 追踪
environment: {
POWERTOOLS_SERVICE_NAME: 'order-service',
POWERTOOLS_METRICS_NAMESPACE: 'MyApp',
LOG_LEVEL: 'INFO',
},
});
``

高效使用 MCP 服务器

在构建 Serverless 基础设施时,使用 CDK MCP 服务器(通过 aws-cdk-development 依赖)获取 Construct 推荐和 CDK 特定指南。

在实现之前,使用 AWS Documentation MCP 验证服务功能、区域可用性和 API 规范。

附加资源

本技能包含基于 AWS 最佳实践的全面参考文档:

  • Serverless 模式references/serverless-patterns.md
- 核心 Serverless 架构与 API 模式 - 数据处理与集成模式 - 使用 Step Functions 进行编排 - 应避免的反模式
  • 事件驱动架构 (EDA) 模式references/eda-patterns.md
- 事件路由与处理模式 - 事件溯源 (Event Sourcing) 与 Saga 模式 - 幂等性与错误处理 - 消息排序与去重
  • 安全最佳实践references/security-best-practices.md
- 责任共担模型 - IAM 最小权限模式 - 数据保护与加密 - 基于 VPC 的网络安全
  • 可观测性最佳实践references/observability-best-practices.md
- 三大支柱:指标 (Metrics)、日志 (Logs)、追踪 (Traces) - 使用 Lambda Powertools 进行结构化日志记录 - X-Ray 分布式追踪 - CloudWatch 警报与仪表板
  • 性能优化references/performance-optimization.md
- 冷启动优化技术 - 内存与 CPU 优化 - 减小包体积 - 预留并发 (Provisioned Concurrency) 模式
  • 部署最佳实践references/deployment-best-practices.md`
- CI/CD 流水线设计 - 测试策略(单元测试、集成测试、负载测试) - 部署策略(金丝雀发布、蓝绿部署) - 回滚与安全机制

外部资源

  • AWS Well-Architected Serverless Lens:https://docs.aws.amazon.com/wellarchitected/latest/serverless-applications-lens/

  • ServerlessLand.com:预构建的 Serverless 模式

  • AWS Serverless Workshops:https://serverlessland.com/learn?type=Workshops

如需详细的实现模式、反模式和代码示例,请参阅技能目录中的完整参考文档。

局限性

  • 仅在任务与上游来源及本地项目上下文明确匹配时使用本技能。
  • 在应用更改前,请验证命令、生成的代码、依赖项、凭证以及外部服务的行为。
  • 不要将示例视为环境特定测试、安全审查或破坏性/高成本操作用户审批的替代方案。