DynamoDB中的原子计数器

Mar*_*ark 26 concurrency counter atomic increment amazon-dynamodb

我正考虑在我的应用程序中使用Amazon DynamoDB,我对其原子计数器的可靠性有疑问.

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

柜台应该是超级可靠的,永远不会错过任何一个.有人在这样的关键环境中测试了DynamoDB吗?

谢谢

小智 18

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/).

  • 可悲的是,链接腐烂已在第二个链接上为此答案设置 (3认同)

BCo*_*tes 8

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

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

  • 如果您使用更新语句中的 `ReturnValues` 会怎样?这样您就可以在更新完成后获得该值。返回值是强一致的。那你就不用读了,再更新。如果您的网络掉线,请重试。最坏的情况是您跳过序列中的一个数字。http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html#DDB-UpdateItem-request-ReturnValues (2认同)