如何设计无服务器的文件转换

时间:2019-06-03 07:22:41

标签: amazon-web-services amazon-s3 error-handling aws-lambda status

我正在设计一个系统,在其中要使用AWS和S3存储桶的无服务器功能。

我在S3存储桶中有一些Word文件,并希望对文件进行一些转换(此代码将由我编写,我想使用无服务器功能将其托管,假设此服务的名称为{{ 1}}服务)并生成新文件。

假设用户发送了一个转换文件的请求,并且该请求中包含了文件名。

现在我有以下问题:

  • 我不希望服务执行顺序的操作,例如,如果FileTransformation在请求中给出了10个文件名,而另外一个user1也给出了一个要求再提供15个文件。我不希望出现“一旦user2请求完成然后user1请求应该开始”的情况。我该如何处理?
  • 假设user2user1询问了他们的请求状态,如何报告?这需要对我的user2服务做些额外的事情吗?
  • 如果请求失败,如何通知用户?

在开发上述服务时是否应该考虑任何AWS服务?

我认为我们可以使用消息代理将请求发送到服务。 CloudWatch用于错误报告或其他内容。

1 个答案:

答案 0 :(得分:2)

您的设计可能如下所示:

  1. S3存储桶具有一个objectCreated事件触发器(在S3存储桶通知部分中进行了设置),将触发Lambda进行处理
  2. 文件上传到S3存储桶
  3. 每个文件都会触发Lambda对其进行处理(并发Lambda,因此不是是连续的
  4. 如果Lambda遇到错误,它可以通知用户(请参阅下面的注释解决此问题)
  5. Lambda一旦完成处理,就可以执行您希望执行的任何操作(例如,通过SES通过电子邮件发送结果,或将结果文件存储在S3中)
  

我不希望这些服务做顺序的事情

当您使用无服务器的AWS Lambda时,您的Lambda将运行多个并发实例(您可以使用保留的并发执行值限制和/或保留)。

  

假设user1和user2询问他们的请求状态

为此,您可能需要实现一个DynamoDB来保存每个请求的状态。触发Lambda时,它可以用状态为“进行中”的方式写入DynamoDB,然后可以将其相应地更新为“完成”或“失败”。然后,您将拥有一个单独的API,该API可在用户请求更新时读取该表

  

如果请求在两次之间失败,如何通知用户?

您可以上传带有前缀的文件,该前缀包含用户的电子邮件或任何其他通知介质,例如:files/userA/userA@test.com/file.doc。这样,当Lambda触发并开始处理时,如果处理失败,它将知道将结果发送到的电子邮件。

编辑: 基于注释,如果您想要一种方法,其中文件已存在于S3中并且用户请求处理,则只需将用户的消息发送到SQS队列,然后为其使用Lambda触发器(它将触发并发执行)。 Lambda处理队列,而不是顺序的。或者,您可以让API直接调用Lambda,然后让用户等待(如果处理相对较快,这也可以)