
本文介绍一种无需每日全量扫描、高可扩展的订阅到期自动化处理方案:通过 dynamodb 的 ttl(time-to-live)功能自动触发清理,并结合 lambda 函数实现状态更新与短信通知,彻底规避百万级用户轮询带来的性能瓶颈。
本文介绍一种无需每日全量扫描、高可扩展的订阅到期自动化处理方案:通过 dynamodb 的 ttl(time-to-live)功能自动触发清理,并结合 lambda 函数实现状态更新与短信通知,彻底规避百万级用户轮询带来的性能瓶颈。
在 SaaS 或会员制应用中,用户订购日/周/月套餐后,系统需在到期时自动停用权限并发送提醒(如短信)。传统做法是使用 Spring 的 @Scheduled 每日执行一次批处理,查询所有用户并比对 endDate 字段——该方式在用户量达百万级时将引发严重问题:数据库压力陡增、JVM 内存占用飙升、任务延迟风险加剧,且难以水平扩展。
现代云原生架构下,更优解是将“时间驱动逻辑”下沉至数据层,交由数据库自身完成到期判定与事件触发。AWS DynamoDB 提供的 TTL(Time-To-Live)机制正是为此场景而生:你只需为每条订阅记录添加一个 expiresAt 时间戳属性(单位:秒级 Unix 时间戳),启用 TTL 后,DynamoDB 会在后台异步删除该记录——不消耗读写容量单位(RCU/WCU),无应用层轮询开销,天然支持千万级规模。
✅ 实现步骤如下:
-
数据建模(DynamoDB 表结构示例)
在用户订阅表(如 subscriptions)中,确保包含以下关键字段:{ "id": "sub_abc123", "userId": "usr_xyz789", "passType": "MONTHLY", "startDate": "2024-05-01T00:00:00Z", "endDate": "2024-05-31T23:59:59Z", "expiresAt": 1717228799 // ⚠️ 必须为数值型 Unix 时间戳(秒),非字符串! }? 注意:expiresAt 值 = endDate 对应的秒级时间戳(如 Java 中 endDate.toInstant().getEpochSecond()),DynamoDB TTL 仅识别此格式。
-
启用 TTL 并配置触发器
- 在 AWS 控制台或 CLI 中为表启用 TTL,指定属性名为 expiresAt;
- 为该表配置 DynamoDB Stream(开启 NEW_IMAGE 类型),用于捕获删除事件;
- 创建一个 Lambda 函数,作为 Stream 的消费者(Event Source Mapping),监听 REMOVE 类型事件。
-
Lambda 处理逻辑(Java 示例)
public class SubscriptionExpiryHandler implements RequestHandler<DynamodbEvent, String> { @Override public String handleRequest(DynamodbEvent event, Context context) { for (DynamodbStreamRecord record : event.getRecords()) { if ("REMOVE".equals(record.getEventName())) { Map<String, AttributeValue> oldImage = record.getDynamodb().getOldImage(); String userId = oldImage.get("userId").getS(); String id = oldImage.get("id").getS(); // 1. 更新业务状态(如设置 pass.status = false) updatePassStatusInRDS(userId, id); // 2. 发送短信(调用 Twilio/SMS Gateway) sendExpirySms(userId); // 3. 记录审计日志(可选) log.info("Subscription expired: {}", id); } } return "OK"; } }⚠️ 关键注意事项:
- TTL 删除是异步且最终一致的,通常在 expiresAt 到期后数分钟内发生(SLA 为
- Lambda 需配置足够内存与超时时间(建议 ≥ 30s),以应对批量删除高峰;
- 为防重复处理,可在 Lambda 中加入幂等性控制(如用 DDB Global Table 存储已处理 ID + TTL)。
该方案优势显著:
? 零轮询成本:告别每日全表扫描,资源消耗与用户量解耦;
? 弹性伸缩:DynamoDB 自动扩缩容,Lambda 按事件并发自动扩容;
? 职责清晰:数据库专注数据生命周期管理,应用专注业务逻辑;
? 可观测性强:CloudWatch Logs + X-Ray 可完整追踪从到期→删除→通知的链路。
总结而言,当面对高并发、大数据量的定时状态变更场景时,应优先考虑“事件驱动 + 数据库原生能力”的组合,而非在应用层硬扛轮询压力——这不仅是技术选型的升级,更是云时代架构思维的必然演进。










