我正在开发一个Sping Boot REST API,它必须获取大量数据(100- 200 k条记录),并将响应返回给API消费者,而无需将整个对象列表加载到其内存中。对于基于SQL的数据库,我已经使用JDBCTemplate queryForStreams方法来满足类似的需求。但对于DynamoDB这样的非SQL数据库,我找不到类似的方法来流式传输数据。
一个示例场景是从xyz航空公司dynamoDB数据库中获取在圣诞节周末预订商务舱机票的所有乘客。
注:为清楚起见,进行了编辑。
我正在开发一个Sping Boot REST API,它必须获取大量数据(100- 200 k条记录),并将响应返回给API消费者,而无需将整个对象列表加载到其内存中。对于基于SQL的数据库,我已经使用JDBCTemplate queryForStreams方法来满足类似的需求。但对于DynamoDB这样的非SQL数据库,我找不到类似的方法来流式传输数据。
一个示例场景是从xyz航空公司dynamoDB数据库中获取在圣诞节周末预订商务舱机票的所有乘客。
注:为清楚起见,进行了编辑。
4条答案
按热度按时间u59ebvdq1#
每次从DynamoDB请求阅读GB的数据似乎不可扩展。最终用户是否需要所有这些数据,其目的是什么?
DynamoDB每个请求只能返回1MB,因此对于单个最终用户API调用,您必须向DynamoDB发出许多分页请求。
如果您使用的是
Scan
,那么您的解决方案根本无法扩展,我可能会建议您使用不同的数据库。fcy6dtqo2#
一般来说,这不是REST的一个好用例。您是否考虑过将查询结果存储在S3中?
您的rest API将返回一个任务id,然后您可以使用它来检查查询的进度并最终下载结果。
通过这种方式,您可以获得无限的可伸缩性,并且可以运行大量的并行dynamo扫描或查询。
vi4fp9gy3#
最快的方法是使用并行扫描操作。假设您在DynamoDB表上有足够的读取容量,这将为您提供非常快的结果。
有关示例,请参见https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ScanJavaDocumentAPI.html中的“使用Java进行并行扫描
kwvwclae4#
动态数据库
以Amazon使用DDB的方式来考虑它,对于电子商务-分页数据的小型小于100的列表,项目通常很小,但项目必须易于更新
在这种情况下,您将永远不需要从表中存储/读取GB的数据
您的需求是“我们如何...”的问题
我们如何在AWS中存储数GB的数据并快速检索这些数据?
AWS最佳实践
在我们深入解决上述“hmw”问题之前,我们需要了解AWS的一些核心原则
AWS将这些原则或“支柱”称为其精心构建的框架
您可以在此处阅读更多相关信息https://aws.amazon.com/architecture/well-architected/
其中大部分都是这样描述的:监控、安全性、可靠性、性能、成本效益、计算成本低(意味着环保)
各种解决方案
存储
您需要存储GB的数据
这仍然取决于您尝试在此处存储的内容,但对于大多数存储需求,您将使用S3
为了确保我们保持与良好架构框架的“兼容”,我们需要启用加密(在传输中,在休息时),阻止公共桶访问等。
为了使一切都经济高效,我们必须考虑何时访问这些数据。如果定期访问,我们将不得不使用“热”存储,否则“冷”存储S3选项更便宜,但您需要付出检索时间。
显著提及
如果您有特定的数据科学需求,您应该查看:Data Lakes(仍在底层使用S3)、Glue、Athena(S3之上的查询层)
如果您正在存储基于文本的数据,并且需要使用OpenSearch进行近乎即时的搜索和检索-这对于聊天相关数据非常有用
数据存储
这取决于您的应用程序,但大多数人仍然保留一个DynamoDB表,作为S3查询的Map。
DDB是查询优化和超级性能当你完全了解你的数据查询或访问模式。
根据访问模式而不是实体来设计表。
例如
单表设计只是简化了少量请求中的数据检索,但您确实需要反复使用表设计,直到它合适为止。
我的建议:要有创造性,根据你的需要混合和匹配表格样式。基于实体的表格在大多数应用程序中仍然很有用。
一旦你发现新的东西,也希望重做你的表。
在这里,使用基础结构即代码工具使拆卸和重新创建表变得更容易是至关重要的- CDK非常适合于此。
请记住,您是按读取和写入单位计费的。这是一个设计良好的表(以匹配您的访问模式)将帮助您以低成本进行简洁的查询。
数据检索
在这里,您可以根据应用程序的不同选择不同的选项
同样,我建议在S3中存储大项目,而不是DynamoDB,所以在这种情况下,从S3下载GB的数据相对容易。
您还可以使用 parquet 以优化的格式存储数据。
此外,如果您选择使用DynamoDB作为S3存储桶的哈希Map,则可以快速找到您的文件和位置,然后将它们放在队列中,以便在后台进行检索。
您还可以将存储桶中的文件复制到作业文件夹,压缩数据并向用户提供该压缩的URL。
您还可以使用DataSync跨存储桶进行复制。
最终注解
在我看来,你是在AWS中存储数据,然后下载进行处理。
大多数团队通过将其处理和存储迁移到AWS来实现这一点,并在云中运行整个流程。