使用AWS SQS进行作业排队,但最大限度地减少“工人”的正常运行时间

时间:2012-12-20 16:41:45

标签: amazon-web-services amazon-ec2 amazon-sqs

我正在设计我的第一个Amazon AWS项目,我可以在队列处理方面使用一些帮助。

此服务通过ASP.net Web API服务或GUI网站(仅调用API)接受处理作业。每个作业都有一个或多个与之关联的文件以及有关作业类型的一些规则。我希望将每个作业排入队列,大概使用AWS SQS。然后,作业将由“worker”处理,这是一个带有.Net包装器的python脚本。 python脚本是一个现有的批处理器,无法为AWS更改/自定义,因此.Net中的包装器管理AWS部分并将正确的参数传递给python。

问题在于我们不会有大量的工作,但每项工作都是计算密集型的。转到AWS的原因之一是最大限度地降低基础架构成本。我打算在弹性beanstalk上运行前端网站(Web API + ASP.net MVC4站点)。但我宁愿没有一个专门的工人机器总是在线轮询工作,因为这些工人需要有点“更强”的实例(用于处理),并且我们花了很多钱,大多数情况下无所事事。

有没有办法只在beanstalk上运行web部分,然后只有在队列中有项目时才会启动工作进程?我意识到我可以有一个微型“控制器”实例总是在线轮询,然后让它控制计算旋转,但即便如此,似乎不应该需要它。可以基于非零SQS队列大小启动EC2实例吗?所以基本上web api会将作业添加到队列中,有些东西会监视队列并看到它非零,这会触发EC2工作程序启动,它会在启动时旋转并轮询队列。它一直处理直到队列为止,然后才会触发它关闭。

1 个答案:

答案 0 :(得分:6)

您可以将Autoscaling与SQS结合使用来动态启动和停止EC2实例。有AWS blog post描述了您正在考虑的架构。