基于AWS持久化存储的滑动延迟与定时器可靠实现方案问询
滑动定时器可靠实现方案分析
需求背景
- 触发带ID的
event-type-A事件时,创建包含该ID及60分钟定时器的记录 - 触发带ID的
event-type-B事件时,更新对应ID的记录,重置60分钟定时器 - 记录到期时,向SQS队列发送消息
功能要求
- 输入新UUID时,创建60分钟定时器
- 输入已存在的UUID时,重置其60分钟定时器
- 基础设施重启后,定时器不丢失且可恢复执行
- 定时器到期后尽快触发动作
核心问题
如何可靠实现上述功能?应用服务器可能无法及时处理到期定时器,但恢复后必须执行;所有定时器信息需存储在应用服务器外部,并发定时器最多可达10k个。
现有方案及痛点
- Redis/Elasticache TTL方案:应用服务器响应
event-type-A创建/更新内存记录,订阅键过期事件并发送至SQS。但该方案数据存储不健壮,Elasticache更新可能丢失记录;应用服务器不可用时会遗漏定时器;且Redis过期事件触发不精确。
备选方案困境
- DynamoDB TTL方案:TTL有效期可达数天,但可靠性不如Redis TTL
- DynamoDB+定时Lambda方案:Lambda需每分钟scan全表判断是否到期(
lastUpdatedTime超过60分钟),无法使用query,因为ID可能对应多个定时器且PK/SK不可修改 - SQS延迟队列方案:SQS最大延迟时间仅15分钟,无法满足60分钟的定时器需求
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

