我在AWS微型实例中有一个24/7运行的Web应用程序,它运行正常。
偶尔(每天10到50次)我需要在CPU密集型任务中处理大量数据(存储在RDS上)。这对我的微观实例来说太过分了。
启动EC2服务器执行此任务似乎并不是一个好主意,因为这些任务必须在用户请求时按需执行,并且我需要低延迟(少于10秒)。
是否有任何亚马逊服务可以提交我的任务并利用更高的CPU容量?
请记住,我的任务需要从RDS读取大量数据。
答案 0 :(得分:0)
您可以在一天中的特定截止时间内将所有任务10到50排队,然后启动实例来处理该任务并在完成处理后终止该任务。其中的调度部分可以由Micro实例完成。
Micro实例启动High Compute Instance后;其余部分可由高计算实例执行;一旦所有要处理的队列的队列都为空,您就可以终止该实例。
这就像计划中的0实例到1实例。
答案 1 :(得分:0)
这取决于您愿意支付的费用,处理的复杂程度,服务的未来规模,预先计算结果的能力等等。
一个选项是拥有一个更大的实例(或在服务规模的情况下实例池),准备进行处理以触发它们。您可以使用竞价型实例(http://aws.amazon.com/ec2/purchasing-options/reserved-instances/)使用预留实例定价(http://aws.amazon.com/ec2/purchasing-options/spot-instances/)甚至更好地降低此计算机的成本。有了这些风险,您可能会遇到以下风险,即您无法启动并运行实例,并且您需要使用按需实例支持它。
这可能是一个更昂贵的解决方案,但随着越来越多的工作,如运行,每个工作的成本"正在急剧下降。
另一种选择是将处理卸载到不同的服务。例如,如果您可以使用DynamoDB或Redis等外部服务的查询语法运行计算,则可以继续使用微实例来触发查询。例如,带有ElastiCache的Redis可以进行复杂的数据操作,例如排序集合交集等。您需要确保将数据也存储在其他数据存储中,然后编写查询。
另一种选择是预先计算这些计算。这实际上取决于您需要运行的工作类型。如果您可以在高级中准备这些输出,并且仅使用从计算时间到请求时间的最新数据更新其结果,那么在没有这些不可预测的CPU峰值的情况下,您的计算机上也可能更容易做好准备。
答案 2 :(得分:0)
我们之所以使用AWS Batch,主要是因为它位于其他选项之上。除了AWS Batch,我们还考虑了其他服务器AWS Lambda,它们为每个任务使用单独的服务器,依此类推。
但是由于种种原因,我们最终选择了AWS Batch:
设置起来也很容易。这是有关如何为每个用户发射火箭的快速代码段。有关更多信息,请访问此处:https://fulcrum.rocks/blog/cpu-intensive-tasks
`const comand = "npm run rocket"
const newJob = await new Promise((resolve, reject) => {
batch.submitJob(
{
jobName: "your_important_job",
jobDefinition: "killer_process",
jobQueue: "night_users",
timeout: {
attemptDurationSeconds: 600
},
retryStrategy: {
attempts: 1
},
containerOverrides: {
vcpus: 2,
memory: 2048,
command: [comand]
}
},
(err, data) => {
if (err) {
console.error(err.message);
reject(err);
}
resolve(data);
}
);
});
`