Car*_*ter 5 amazon-web-services amazon-dynamodb
建筑问题。作为游戏的一部分,我们希望跟踪所有玩家已完成的项目数量。跟踪玩家状态没有问题,发电机分片可以很好地跨用户。但是,如果我想要一个数字来显示已处理的 X 数量,那么我谈论的是单行表,这意味着从该表更新和检索的每个人都在完全相同的行上。我很确定 Dynamo 会承担很多这样的任务,但我想知道它的扩展能力如何。当每个人执行一项功能时,计数器会增加,然后他们会读回它。
我想我们可以将计数器保存在 memcache 或 Redis 中,并在新项目被分类时更新它,并在每晚重建它。这似乎有点矫枉过正,并且需要额外的基础设施。
有什么想法吗?有人成功做到这一点吗?Dynamo 会进行跟踪,但他们返回的数字可能已经过时了 6 个小时。
小智 3
是的,如果您预计每秒写入次数超过 1000 次(单个分区可用的写入次数),那么由每个人递增的单个项目将无法很好地扩展。如果您预计每秒写入次数少于 1000 次,DynamoDB 确实允许对单个项目进行强一致性读取(或者,您也可以要求在 UpdateItem 请求的结果中返回更新的值)
聚合 memcached 或 Redis 中的计数并定期向 DynamoDB 执行“批量”ADD(例如 ADD 1000)肯定有助于随着时间的推移分散访问,如果您需要强一致性,在事件中丢失缓存数据,这可能是最好的方法崩溃是可以接受的,并且您的可用性要求很低。
如果您不需要强一致性(例如,可以将计数更多地视为下限),您可以使用写分片来保留多个计数器以分散访问,这样每个计数器的访问次数预计会少于 1000 次。第二。
然后,您可以通过 Scan(如果只有几个小计数,则扫描成本不会很高)或多个 GetItem 调用定期聚合计数。这些幻灯片对此进行了一些讨论。
或者,如果您可以使用预览区域,则可以在表上启用 DynamoDB Streams 并使用 AWS Lambda 函数,该函数从表流中获取批量计数并将计数聚合到子计数中。重复上述操作以建立最终计数。这种方法将允许不断聚合总计数,而不是设置定期扫描活动。