DynamoDB中原子计数器的可靠性

时间:2012-02-20 20:56:07

标签: concurrency counter atomic increment amazon-dynamodb

我正考虑在我的申请中使用Amazon DynamoDB,我对其atomic counters可靠性有疑问。

我正在构建一个需要同时始终的分布式应用程序,增加/减少存储在Dynamo属性中的计数器。 我想知道Dynamo的原子计数器在一个繁重的并发环境中是多么可靠,其中并发级别非常高(例如,平均速率为20k并发命中率 - 获得这个想法,这将是近52亿增量/每月递减)。

计数器应该是超级可靠的,并且从不错过命中。有人在这样的关键环境中测试了DynamoDB吗?

由于

3 个答案:

答案 0 :(得分:17)

DynamoDB通过在多个服务器之间拆分密钥来获取它的扩展属性。这类似于Cassandra和HBase等其他分布式数据库的规模。虽然您可以增加DynamoDB的吞吐量,只需将数据移动到多个服务器,现在每个服务器都可以处理总并发连接数/服务器数。请查看他们的常见问题解答,了解如何实现最大吞吐量(http://aws.amazon.com/dynamodb/faqs/#Will_I_always_be_able_to_achieve_my_level_of_provisioned_throughput

这意味着拥有一个直接递增的密钥将无法扩展,因为该密钥必须位于一台服务器上。还有其他方法可以解决这个问题,例如在内存聚合中使用DynamoDB的刷新增量(虽然这可能存在可靠性问题)或分片计数器,其中增量分布在多个键上,并通过拉动分片中的所有键来回读counter(http://whynosql.com/scaling-distributed-counters/)。

答案 1 :(得分:8)

除了gigq关于可伸缩性的答案之外,DynamoDBs的原子增量不是幂等的,因此不可靠:如果在发出UpdateItem ADD请求后连接断开,您无法知道添加是否已提交,因此您不知道是否应该重试。

DynamoDB条件更新解决了这个问题,但代价是系统的可扩展性更低,因为每次同时尝试对属性进行两次更改时,即使没有错误,也必须重试。

答案 2 :(得分:1)

如果要编写单个dynamo数据库密钥,则会遇到热分区问题。热分区问题每个索引开始大约300 TPS。因此,如果表中有5个索引,您可能会看到热分区问题大约为300 / 5~60 TPS。

否则,dynamo db可扩展到大约10-40K TPS,具体取决于您的使用情况。