避免油门dynamoDB

时间:2015-09-27 23:24:39

标签: amazon-web-services cloud amazon-dynamodb

我是云计算的新手,但有一个问题是,我将要描述的机制是否存在或是否可以创建?

Dynamodb已提供吞吐量(例如,每秒写入100次)。当然,在现实世界中,应用程序的实际吞吐量非常动态,几乎永远不会超过100个写入/秒的预配量。我在想什么是一种类型的dynamodb队列会很棒。例如,我在高峰时段的dynamodb每秒可能会收到500个写入请求(是我分配的5倍)并会返回错误。是否有一些我可以放在客户端和数据库之间的队列,所以客户端请求进入队列,客户端得到确认他们的请求已被处理,然后队列以100的速率向dynamodb发出请求/确切地说/每秒写入,这样就没有返回错误,我不需要提高通行费,这将增加我的成本?

3 个答案:

答案 0 :(得分:12)

将AWS SQS置于DynamoDB的前端可以为您解决此问题,并且不是一种不常见的设计模式。 SQS已经非常适合扩展到它需要的大小,并且使用不可预测的流模式来摄取大量消息。

您可以先将所有消息放入SQS,或者在超过DynamoDB数据库的设计输出时使用SQS作为溢出缓冲区。

一个或多个工作者实例可以读取来自SQS队列的消息,并按照您决定的速度将它们放入DynamoDB中。

如果进入的消息的顺序非常重要,Kinesis是您接收传入消息的另一个选项,然后按照您定义的速度将它们按照它们到达的顺序插入到DynamoDB中。

IMO,SQS将更容易使用,但如果您的需求更复杂,Kineses将为您提供更多灵活性。

答案 1 :(得分:3)

仅使用DynamoDB无法实现。 DynamoDB旨在实现统一,可扩展,可预测的工作负载。如果你想在DynamoDB前面放一个队列,那你就自己做了。

DynamoDB确实对burst capacity有一点容忍度,但这不是为了持续使用。你应该阅读最佳实践部分Consider Workload Uniformity When Adjusting Provisioned Throughput,但这里有一些,我认为很重要,段落中有一些强调的事情:

  

对于设计用于统一工作负载的应用程序,DynamoDB的分区分配活动不明显。如Use Burst Capacity Sparingly中所述,工作负载中的临时不均匀性通常可以通过突发限额来吸收。但是,如果您的应用程序必须定期处理非统一工作负载,则应设计考虑到DynamoDB的分区行为的表(请参阅Understand Partition Behavior),并在增加和减少该表上的预配置吞吐量时注意。

     

如果减少表的预配置吞吐量,DynamoDB将不会减少分区数。假设您创建的表具有比应用程序实际需要的更大的预配置吞吐量,然后稍后降低预配置吞吐量。在这种情况下,每个分区的预配置吞吐量将小于最初创建具有较少吞吐量的表时的预期吞吐量。

有些工具可以帮助自动扩展DynamoDB,例如sebdah/dynamic-dynamodb,这可能值得研究。

答案 2 :(得分:0)

针对最近看到的内容的一个更新,因为DynamoDB于2018年启动了按需容量模式,从而实现了突发容量。

您无需事先确定容量,它将根据需求扩展读写容量。

请参阅: https://aws.amazon.com/blogs/aws/amazon-dynamodb-on-demand-no-capacity-planning-and-pay-per-request-pricing/