我在AWS EC2实例上有一个应用程序,每天运行一次。应用程序从web服务中获取一些文件,逐行解析文件,更新数据库,根据数据库中的更改更新S3文件,向客户发送通知电子邮件以及其他一些任务。
这是一系列必须按顺序执行的逻辑任务,尽管其中一些任务可以被认为是可以并行执行的子任务。所有任务都是Perl脚本和Java程序的组合,单个Perl脚本充当管理器,依次执行每个脚本。有些任务需要45分钟才能完成,整个过程总共需要3小时。
我想让整个过程变得无服务器化。我最初的想法是使用AWS ,这样每个任务都将作为Lambda函数执行,直到我发现Lambda函数强制执行5分钟的执行超时。看起来,AWS Step函数服务实际上更适合我的用例,但我的理解是,这个服务是由Lambda支持的,所以任务仍然有5分钟的执行限制。
(我还意识到,我必须将我的Perl脚本重写为Lambda支持的语言)。
我假设我可以通过将代码重构为更小的函数来绕过执行时间限制,这样可以保证在5分钟内完成。但在我的特殊情况下,这似乎是没有效率的。
当前,数据库更新任务一次处理一个文件中的行。要使用Lambda,Lambda函数只需要处理文件中的一行(或极少数行),以保证不超过5分钟的执行时间。这将涉及在每次调用Lambda函数时打开和关闭与数据库的连接。此外,处理的每一行都应该生成一个写入文件的条目,并将其存储在S3中。现在,我只需在内存中保留一个文件句柄,并在处理所有行时将该文件写入S3,但是使用Lambda,我需要继续读取该文件,更新它并将其写入S3。
我想问的是:
发布于 2017-06-06 08:13:41
你想要的叫做活动工作者。博士:你注册了“活动”,每个人都得到了一个ARN。然后,您可以将该ARN放在Task states的资源字段中,然后运行一些代码(在Lambda中,在EC2上,在您的地下室,无论在什么地方)来轮询由该ARN识别的任务,然后再回电话报告成功或失败。“活动工人”最多可以运行一年。
AWS文档的一步一步的详细信息
作为对RTF评论的回应,这里有一个更深层次的讨论:假设您有在color_turtles.pl中给海龟着色的代码。因此,您所做的是调用CreateActivity API --参见CreateActivity.html --命名为"ColorTurtles“,它将给您返回一个ARN,一个以arn:aws开头的字符串.然后,在状态机中,使用该ARN作为资源字段的值,创建一个任务状态。然后将代码添加到color_turtles.pl中,以便使用GetActivityTask.html轮询服务--每当您运行的机器到达该任务时,它都会查找活动工作人员轮询。它将为您的轮询工作人员提供任务的输入,然后处理输入并生成一些输出,并调用SendTaskSuccess或SendTaskFailure。所有这些都只是REST HTTP调用,所以您可以在任何地方运行它们,我的意思是在任何地方;在Lambda中,在EC2实例上,或者在Internet上的任何计算机上。
发布于 2017-06-05 12:38:40
因此,要回答你的问题:
1)是的,如果你有一些可以运行大约45分钟的东西,而你可以用Lambda/Step函数来设计它,那么你最好得到一个EC2微实例。
2)不,你差不多明白了。
3)如前所述,您希望使用EC2来实现这一点,有一篇很好的文章介绍了如何使用数据管道启动/停止EC2实例这里,只有在需要时才启动实例(如果有的话)成本可以忽略不计。
我有一些以这种方式运行的任务,通常您可以使用一个t2.微实例,这是免费的,符合条件的。
您还可以在EC2实例上运行perl脚本,因此不需要重写它们!
发布于 2018-10-26 20:57:36
我将从这一点开始,似乎您正在寻找AWS上的工作流解决方案。SWF和Step函数是最流行的两种函数。Steps功能是最近推出的,受到AWS的鼓励,而不是SWF。
SWF具有处理长期运行的任务的本机能力,缺点是您必须为决策者提供自己的执行环境(不能使用lambda)。
使用step函数,您可以通过两种不同的方式来完成这一任务。蒂姆在回答中提出了其中一种方法。实现的另一种方法是在step函数中使用作业轮询器。作业计票器能够调用(轮询)您的资源,并确定任务是否完成,如果没有,您可以在指定的时间内以等待模式发送执行。如前所述,任何工作流当前允许的最大执行时间为1年。如果您的任务可能需要超过一年的时间,您不能使用step函数的当前形式。
https://stackoverflow.com/questions/44368629
复制相似问题