Amazon web services AWS SWF在特定S3文件存在时才进行活动等待

Amazon web services AWS SWF在特定S3文件存在时才进行活动等待,amazon-web-services,amazon-s3,amazon-swf,Amazon Web Services,Amazon S3,Amazon Swf,我有一个SWF工作流,它有两个活动 第一个活动(A1)只是调用一个服务API,该服务API反过来启动一个应用程序,该应用程序将(最终)上载特定S3存储桶中的文件 第二个活动(A2)下载此文件并评估其中包含的数据 我的问题是,我有一个重复失败和重试,因为S3文件不存在,直到文件上传的应用程序 A1只需启动一个外部应用程序,并在收到“application Successfully Launched”(应用程序成功启动)响应后立即完成,因此让A2等待A1返回的承诺不会让A2等待文件进入S3 我最初的

我有一个SWF工作流,它有两个活动

第一个活动(A1)只是调用一个服务API,该服务API反过来启动一个应用程序,该应用程序将(最终)上载特定S3存储桶中的文件

第二个活动(A2)下载此文件并评估其中包含的数据

我的问题是,我有一个重复失败和重试,因为S3文件不存在,直到文件上传的应用程序

A1只需启动一个外部应用程序,并在收到“application Successfully Launched”(应用程序成功启动)响应后立即完成,因此让A2等待A1返回的承诺不会让A2等待文件进入S3

我最初的解决方案是捕获由于文件尚未存在而导致的异常,然后在“活动”中重试,但这是一个糟糕的选择,因为“活动”将继续运行,并阻止在同一台计算机上运行的其他工作流执行有用的工作

我认为理想的解决方案是“休眠”活动,并每隔X分钟“唤醒”一次,以查看文件是否存在,并且不会导致其他工作流陷入饥饿状态


这可能吗

另一种选择是将两个步骤分开:

  • 调用API服务。甚至不需要使用SWF来实现这一点

  • 创建一个Amazon S3事件,在bucket中创建文件时触发AWS Lambda函数。然后Lambda函数可以处理该文件

  • 因此,与其不断检查文件是否存在,不如在Lambda函数出现时使用该事件触发它


    当然,如果需要大量文件,可能会增加复杂性,因此Lambda函数需要知道如何处理出现的特定文件。另一种方法是将两个步骤分开:

  • 调用API服务。甚至不需要使用SWF来实现这一点

  • 创建一个Amazon S3事件,在bucket中创建文件时触发AWS Lambda函数。然后Lambda函数可以处理该文件

  • 因此,与其不断检查文件是否存在,不如在Lambda函数出现时使用该事件触发它

    当然,如果需要大量文件,可能会增加复杂性,因此Lambda函数需要知道如何处理出现的特定文件,您可以使用该文件来释放活动工作线程并异步执行重试和心跳

    另一种选择是为该活动提供单独的任务列表和工作人员,并且打开活动的限制要高得多。这样,它不会占用执行其他活动类型的工作线程的容量。

    您可以使用它来释放活动工作线程,并异步执行重试和心跳


    另一种选择是为该活动提供单独的任务列表和工作人员,并且打开活动的限制要高得多。这样,它不会占用执行其他活动类型的工作人员的容量。

    如果我从头开始创建整个系统,我会这样做,但遗憾的是,我没有时间和资源这样做。这种方法可能遇到的一个障碍是多个工作流同时运行的情况,这意味着可能会有其他不相关的上传到目标存储桶,从而触发Lambda函数。将所有内容保存在SWF中意味着每个工作流都确切地知道它在bucket中查找的文件。好的。另一种选择是从SWF切换到AWS Step功能。它是AWS Lambda之上的元层。它包括重试和延迟,这听起来非常适合您的情况。如果您已经在使用Lambda,那么这可能是一个相对容易的切换。如果我从头开始创建整个系统,我会这样做,但遗憾的是,我没有时间和资源这样做。这种方法可能遇到的一个障碍是多个工作流同时运行的情况,这意味着可能会有其他不相关的上传到目标存储桶,从而触发Lambda函数。将所有内容保存在SWF中意味着每个工作流都确切地知道它在bucket中查找的文件。好的。另一种选择是从SWF切换到AWS Step功能。它是AWS Lambda之上的元层。它包括重试和延迟,这听起来非常适合您的情况。如果您已经在使用Lambda,那么这可能是一个相对容易的切换。