5月27日 16:24
Serverless 架构下的定时任务和事件驱动如何实现?
Serverless 定时任务的实现方式
EventBridge(CloudWatch Events)定时触发
EventBridge 是 AWS Serverless 架构中最常用的定时任务触发器。它支持两种调度表达式:
- Rate 表达式:按固定间隔触发,例如
rate(5 minutes)、rate(1 hour)。适合周期性轮询类任务。 - Cron 表达式:按日历时间触发,例如
cron(0 10 * * ? *)表示每天 UTC 10:00 执行。适合对执行时间有精确要求的场景,如每日凌晨生成报表。
EventBridge 还支持设置时区,避免因 UTC 与本地时间差异导致的调度偏移。典型应用场景包括数据备份、日志轮转、报表生成和过期资源清理。
定时任务的配置要点
在 serverless.yml 中配置定时触发器的示例:
yamlfunctions: backupTask: handler: handler.backup events: - schedule: rate: cron(0 2 * * ? *) enabled: true description: "Daily backup at 2 AM UTC"
配置时需要注意:
- Lambda 超时限制:Lambda 最长执行时间为 15 分钟,超过则需改用 Step Functions 或 ECS Fargate。
- 并发控制:如果上一次执行还未结束而新的触发又来了,需要决定是跳过还是排队。可通过 DynamoDB 分布式锁或 SQS 队列控制并发。
- 幂等性设计:定时任务可能因重试而重复执行,必须在业务逻辑中保证幂等——例如用唯一任务 ID 写入去重表,或利用 DynamoDB 的条件写入。
事件驱动架构的实现
事件源与触发机制
Serverless 架构下的事件驱动核心思想是:函数不需要主动轮询,而是由事件源在状态变化时自动触发。常见事件源:
- S3 事件:文件上传、删除、修改时触发 Lambda,常用于图片处理、数据导入。
- DynamoDB Streams:表数据变更时触发,适合数据同步、审计日志记录。
- SNS/SQS:SNS 用于扇出式消息广播,SQS 用于削峰填谷和可靠消费。两者可组合使用:SNS 转发到 SQS,Lambda 从 SQS 消费。
- API Gateway:将 HTTP 请求映射为事件触发 Lambda,是 Serverless REST API 的标准模式。
- EventBridge 自定义事件:跨服务事件路由,支持内容过滤和模式匹配。
事件处理模式
- 同步直触:事件源直接触发 Lambda,延迟最低,但如果下游失败则整个链路中断。适合简单、低延迟场景。
- 异步队列:事件先写入 SQS,Lambda 从队列消费。优势在于天然支持重试、死信队列和背压控制。适合高吞吐、需可靠投递的场景。
- 事件路由:通过 EventBridge 将一个事件路由到多个目标,实现解耦。例如订单创建事件同时触发库存扣减和通知发送。
事件溯源与可观测性
事件驱动系统因为异步和分布式特性,调试难度较高,需要重视可观测性:
- 事件日志持久化:将所有事件写入 S3 或 DynamoDB 作为事件日志,支撑审计和回溯。
- 状态重建:通过重放事件日志可以重建任意时刻的应用状态,这是事件溯源(Event Sourcing)的核心思路。
- 分布式追踪:使用 AWS X-Ray 或 OpenTelemetry 追踪请求在多个 Lambda 之间的流转路径,定位性能瓶颈。
- 结构化日志:在 Lambda 中输出包含请求 ID、事件类型的 JSON 日志,便于 CloudWatch Logs Insights 查询。
常见应用场景
数据处理流水线
定时任务 + 事件驱动的组合在数据处理中非常常见:
- ETL 流程:EventBridge 定时触发 Lambda 执行数据抽取,处理完成后写入 S3,S3 事件触发下游分析 Lambda。
- 数据清洗:定时扫描脏数据,清洗后通过 SNS 通知下游服务。
- 实时分析:Kinesis Data Streams 接收流数据,Lambda 实时消费并写入分析引擎。
运维自动化
- 资源清理:每天定时扫描未使用的 EC2 实例、未挂载的 EBS 卷,自动释放。
- 健康检查:定时检测服务端点可用性,异常时通过 SNS 发送告警。
- 证书续期:定时检查 SSL 证书到期时间,自动触发续期流程。
业务自动化
- 订单超时处理:EventBridge 定时检查未支付订单,超时自动关闭并释放库存。
- 会员状态更新:每日定时同步会员等级变更,触发权益调整。
- 营销活动调度:定时启动/结束促销活动,事件驱动触发对应的优惠券发放和通知推送。
面试中的关键要点
面试官考察这个话题时,通常关注以下几点:
- 定时任务的可靠性保障:如何处理重复执行、超时、并发冲突?答:幂等设计 + 分布式锁 + 合理超时 + DLQ。
- 事件驱动的解耦优势:为什么要用事件驱动而不是直接调用?答:降低耦合、提高可扩展性、支持独立部署和演进。
- 异步处理的权衡:引入队列后系统可靠性提升了,但一致性变成最终一致性,需要业务方接受这个取舍。
- 成本意识:Serverless 按调用计费,高频定时任务和高吞吐事件可能产生显著费用,需要评估是否适合。