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 中配置定时触发器的示例:

yaml
functions: 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 按调用计费,高频定时任务和高吞吐事件可能产生显著费用,需要评估是否适合。
标签:Serverless