使用 step 函数进行摄取服务是个不错的选择吗?
Is it good option to use step function for ingestion service?
早些时候,我使用主从 lambda 的概念创建了一个摄取服务。主 lambda 被调用以响应 S3 事件并将从 S3 读取 csv 文件并将创建块。
稍后,主 lambda 将异步调用多个从属 lambda。每个slave lambas都会处理这些数据块,最后放入DynamoDB。
在这里,我可以调用多个从属 lambda 实例并实现并行
后来,我读到了 Step Function(SF),它可以协调多个 AWS 服务来完成任务。现在,我正在考虑使用 SF 重新设计我的摄取服务。借助Map状态,可以很方便的实现并行:https://aws.amazon.com/blogs/aws/new-step-functions-support-for-dynamic-parallelism/
但我不确定它会有多大用处,因为这是新功能并且紧密耦合。
关于如何实现此目的的任何建议和/或关于 SF 的任何其他替代方法
首先,我喜欢你创建不同 Master/Slave lambda 的方法:一个常见的错误是尝试创建一个独特的 "recursive" 函数,该函数根据输入事件进行分块和加载.
起初这似乎没问题,但会导致 无限 循环和昂贵的账单。
TL;DR 我认为你的方法没有任何问题,我会坚持下去。
我添加两个关于这个主题的不相关的想法:
当您需要在 DynamoDB 加载完成后执行某些操作时(例如,如果您想删除所有加载的项目,如果 lambda出错了,或者你想记录添加的项目总数)或者在你想切换到串行方法的情况下(例如,在你的 Dynamo Table 上保留一些 WCU)。
AWS Data Pipeline 是一种旨在执行 ETL 并支持从 S3 到 DynamoDB 的工作流的工具。值得一看(在官方文档中可以找到tutorial for ingesting from S3 to DynamoDB)。
我觉得你构建服务的方式很好,如果你对它满意,我不会浪费时间去改变它:记住不同设计的好处,但要避免在早期阶段过度优化。
早些时候,我使用主从 lambda 的概念创建了一个摄取服务。主 lambda 被调用以响应 S3 事件并将从 S3 读取 csv 文件并将创建块。 稍后,主 lambda 将异步调用多个从属 lambda。每个slave lambas都会处理这些数据块,最后放入DynamoDB。
在这里,我可以调用多个从属 lambda 实例并实现并行
后来,我读到了 Step Function(SF),它可以协调多个 AWS 服务来完成任务。现在,我正在考虑使用 SF 重新设计我的摄取服务。借助Map状态,可以很方便的实现并行:https://aws.amazon.com/blogs/aws/new-step-functions-support-for-dynamic-parallelism/ 但我不确定它会有多大用处,因为这是新功能并且紧密耦合。
关于如何实现此目的的任何建议和/或关于 SF 的任何其他替代方法
首先,我喜欢你创建不同 Master/Slave lambda 的方法:一个常见的错误是尝试创建一个独特的 "recursive" 函数,该函数根据输入事件进行分块和加载. 起初这似乎没问题,但会导致 无限 循环和昂贵的账单。
TL;DR 我认为你的方法没有任何问题,我会坚持下去。
我添加两个关于这个主题的不相关的想法:
当您需要在 DynamoDB 加载完成后执行某些操作时(例如,如果您想删除所有加载的项目,如果 lambda出错了,或者你想记录添加的项目总数)或者在你想切换到串行方法的情况下(例如,在你的 Dynamo Table 上保留一些 WCU)。
AWS Data Pipeline 是一种旨在执行 ETL 并支持从 S3 到 DynamoDB 的工作流的工具。值得一看(在官方文档中可以找到tutorial for ingesting from S3 to DynamoDB)。
我觉得你构建服务的方式很好,如果你对它满意,我不会浪费时间去改变它:记住不同设计的好处,但要避免在早期阶段过度优化。