百万级DynamoDB表获取存储条目计数的高效实现方案咨询
方案评估与建议
方案优劣对比
- 方案1(Query直接计数):完全不适配你的场景。百万级条目规模下,若单个商铺商品量级超过几十条,每次计数都需要扫描全量匹配条目,不仅延迟会随商品数量线性增长,读成本也非常高——DynamoDB的Query计数按扫描数据量计算读容量,单商铺万级商品的单次计数就要消耗几十甚至上百读单位,性价比远低于查询预存计数。
- 方案2(事务同步更新计数):成本和延迟表现都是三者最差。DynamoDB事务写的成本是普通写的2倍,并发写入场景下很容易出现事务冲突导致重试,反而进一步拉高延迟和开销,而你本身允许最终一致性,完全没必要为了强一致的计数付出额外成本。
- 方案3(Streams触发异步更新计数):你的判断是正确的,该方案是三者中最适配需求的。写入侧不需要额外操作,完全不影响写入延迟和写入成本;Streams的异步处理延迟通常在百毫秒级,完全满足最终一致性要求;查询侧只需要1次GetItem调用,仅消耗1个读容量单位,成本极低。
优化建议
- 计数项直接存在当前DynamoDB表即可,不需要额外建表:可以把计数项的
partitionKey设为{商铺ID}+productCount,sortKey设为固定值如#META#COUNT,和普通商品条目区分开,查询更便捷。 - 处理Streams事件时要做幂等校验:因为DynamoDB Streams存在重复投递的可能,更新计数时不要直接覆盖值,要用DynamoDB的增量更新表达式
SET productCount = productCount + :delta,其中:delta对应新增+1、删除-1,避免重复事件导致计数不准。 - 高并发场景下可以对同商铺的Streams事件做批量聚合,同一个商铺的多次变更合并为一次计数更新,进一步降低写计数的成本。
内容的提问来源于stack exchange,提问作者Shubham Agarwal Bhewanewala
相关产品推荐
相关产品推荐

