获取/更新DynamoDB中的计数器

时间:2015-02-02 19:32:06

标签: amazon-web-services amazon-dynamodb

建筑问题。作为游戏的一部分,我们正在考虑跟踪所有玩家已经完成的项目数量。没有问题跟踪玩家状态,发电机碎片很好地跨用户。但是,如果我想要一个显示已经处理了多少X的单个数字,那么我就是在谈论一个单行表,这意味着每个更新并从该表中检索的人都在同一行上。我非常肯定Dynamo会采取很多这方面的工作,但我想知道它的扩展程度如何。当每个人执行一个函数时,计数器会递增,然后他们会读回来。

我认为我们可以将计数器保存在memcache或Redis中,并在新项目被分类时更新它,并在每晚重建它。这似乎有点过分,需要额外的基础设施。

有什么想法?有人做过这个吗? Dynamo会跟踪,但他们返回的号码可能会过时6个小时。

2 个答案:

答案 0 :(得分:3)

是的,如果您希望每秒写入次数超过1000次(单个分区可用的写入次数),那么每个人都会增加的单个项目将无法很好地扩展。如果您希望每秒写入次数少于1000次,则DynamoDB允许对单个项目进行强一致性读取(或者,您也可以要求在UpdateItem请求的结果中返回更新的值)

汇总memcached或Redis中的计数并执行" bulk"定期向DynamoDB添加(例如ADD 1000)肯定会有助于将访问分散开来,如果您需要强一致性,在崩溃情况下丢失缓存数据并且您的可用性要求很低,则可能是最好的方法。

如果您不需要强一致性(例如,计数可以被视为下限),您可以使用写分片来保持多个计数器以扩展访问,以便每个计数器都可以被访问每秒不到1000次。

然后,您可以定期聚合计数与扫描(如果只有几个小计数,扫描不应该是昂贵的)或多个GetItem调用。在这些slides中对此进行了一些讨论。

或者,如果您可以使用预览区域,则可以在表上启用DynamoDB Streams并使用AWS Lambda函数,该函数从表流中获取批量计数并将计数聚合到子级别中。重复上述步骤以构建最终计数。这种方法可以使总计数不断聚合,而不是设置定期扫描活动。

答案 1 :(得分:0)

这里的主要问题是你真的需要多快才能增加这个数字。我们使用Atomic counters作为生产的一部分,在整个系统中使用一个名为" counter"的全局表。我们很少需要每个计数器每秒增加超过几次,所以此刻缩放不是问题。

这一切都归结为你需要保持(和缩放)的计数器的速率和数量。

如果你需要非常快的计数器,我想有更好的方法(例如内存缓存/ redis)和定期刷新。如果你需要为这个规模做好准备,我不会认为这是一种过度杀伤。