我是AWS新手,正在开发一个无服务器应用程序,其中一个函数需要读取大量数据。永远不会从表中读取单个项目,但所有项目将通过计划功能定期更新。
对于处理此方案的最有效方法,您有何建议?我当前的实现在DynamoDB表上使用scan
操作,但由于我的经验有限,我不确定这是否会在生产中具有高效性。将数据作为JSON文件存储在S3上会更好吗?如果是这样,用计划功能更新值会如此容易吗?
感谢您的时间。
PS:要想知道数据库的大小,会有~1500个项目,每个项目包含一个最多约100个字符串的数组答案 0 :(得分:3)
这取决于每个项目的大小,但是如何?
首先使用DynamoDB或S3,您需要为两项服务付费(在您的情况下为*):
1-每月请求
2-每月存储
如果您有小件物品,如果您从DynamoDB而不是S3读取物品,那么第一种情况将便宜多达577倍
如何:每1,000个S3请求0.01美元,而DynamoDB每月500万次读取(每个最多4 KB)。此外,对于S3中的数据检索,您应该为每GB支付0.01美元,这应该加到该价格。但是,您对S3的写入将是免费的,而您应该为每次写入DynamoDB付费(这几乎是阅读费用的4倍)。
但是,如果你的物品每次读取需要这么多的RCU,那么在这种情况下S3会更便宜。
关于存储成本,S3更便宜,但你应该再看看你的数据大小有多大,因为你为S3支付每GB最高0.023美元,而你每月每GB支付0.25美元,这几乎要贵10倍。
<强>结论强>: 如果您有这么多请求并且您的项目更小,则使用DynamoDB更容易,更直接,因为您没有放弃使用DynamoDB的任何查询功能,如果您使用S3,您将无法获得这些功能。否则,您可以考虑在DynamoDB中保存指向存储在S3中的对象位置的指针。
(*)您为S3中的标签或DynamoDB中的索引支付的成本是需要考虑的另一个因素。
答案 1 :(得分:2)
我将如何做:
安排更新:
Lambda(处理日程变更) - &gt; DynamoDB - &gt; DynamoDBStream - &gt; Lambda(如果存在则读取,将更改应用于所有对象并保存到S3中的单个对象)
阅读时间表:
使用Lambda从S3读取单个对象并根据请求提供所有计划或单个计划。您可以在下次阅读之前检查对象是否被修改,因此您不需要每次都从S3读取并仅从内存中进行阅读。
<强>可扩展性:强>
如果要缩放,则需要将对象拆分为特定大小,这样就不会加载超过3GB内存大小的所有对象(Lambda进程内存大小)
希望这有帮助。
<强> EDIT1:强>
当您冷启动服务lambda时,首先从s3加载对象,之后,您可以检查s3以查找具有since modified date
属性的更新对象(在特定时间间隔或一定数量的请求之后)。 / p>
您还可以将这些数据发送到Lambda内存并从内存中提供,直到更新对象为止。