咨询:网页打开期间定期触发Lambda函数的实现方案
解决方案思路
方案一:复用前端心跳+分布式锁触发更新(适配现有架构,推荐)
你当前前端已有每分钟刷新调用后端Lambda的逻辑,可直接基于此优化,通过锁机制避免重复执行:
- 步骤1:在现有DynamoDB表新增两个字段(或单独建一张小表):
last_update_timestamp:记录数据最后更新的时间戳update_lock:分布式锁标记,设置1分钟TTL自动过期
- 步骤2:修改提供数据的后端Lambda逻辑:
- 收到前端请求后,先读取
last_update_timestamp,判断是否距当前时间超过1分钟 - 若需更新,通过DynamoDB条件写入尝试获取锁:写入
update_lock为当前时间,条件设为attribute_not_exists(update_lock) OR update_lock < :current_time(:current_time为当前时间戳减1分钟) - 只有成功获取锁的Lambda实例,才调用更新数据的Lambda函数
- 更新完成后,同步更新
last_update_timestamp,并删除锁(或依赖TTL自动过期)
- 收到前端请求后,先读取
- 步骤3:更新数据的Lambda内部可再加一层校验:执行前再次检查
last_update_timestamp,避免网络延迟导致的重复执行
该方案完全适配现有架构,无需额外定时任务,仅当有用户访问时才触发更新,且通过分布式锁保证同一时间只有一个更新实例运行。
方案二:动态启停CloudWatch Events定时规则
若希望更新逻辑主动触发而非依赖前端请求,可采用此方案:
- 步骤1:前端每次刷新时,调用一个轻量化心跳API(API Gateway+小型Lambda),在DynamoDB的在线用户表中记录用户活跃状态(写入用户ID+
last_active时间,设置2分钟TTL) - 步骤2:创建监控Lambda,通过CloudWatch Events每1分钟触发一次,逻辑如下:
- 查询在线用户表,检查是否存在
last_active在过去2分钟内的记录 - 若有活跃用户,检查更新Lambda的定时规则是否启用,未启用则开启
- 若无活跃用户,检查定时规则是否启用,已启用则关闭
- 查询在线用户表,检查是否存在
- 步骤3:更新数据的Lambda执行时,同样通过DynamoDB条件写入实现分布式锁,避免并发重复执行
此方案适合希望更新逻辑独立于前端请求的场景,但需额外维护监控Lambda和在线用户表,复杂度稍高。
核心:避免重复执行的分布式锁实现
无论采用哪种方案,分布式锁都是关键,推荐用现有DynamoDB实现,无需额外服务:
- 锁表结构:主键设为固定值
dynamodb_update_lock,字段expire_time(锁过期时间戳) - 获取锁:调用
PutItemAPI,条件表达式设为attribute_not_exists(lock_key) OR expire_time < :current_time,同时写入当前时间+60秒作为expire_time - 释放锁:更新完成后调用
DeleteItem删除锁,或依赖TTL自动过期,避免Lambda异常退出导致锁长期有效
内容的提问来源于stack exchange,提问作者NotGene
相关产品推荐
相关产品推荐

