我在ECS中的容器上运行了很长时间的作业。当自动缩放触发器缩放时,有没有办法告诉ECS在X时间内(或直到触发事件)不会终止任务,所以作业可以完成然后才终止?
假设我在10个实例上有10个容器,其中3个正在运行作业,我希望ECS不会终止这些实例,并仅考虑其余7个实例中的比例。 ECS支持这样的事情吗?
答案 0 :(得分:2)
无法向ECS发出信号,表示在扩展时应该跳过十分之一的特定任务。
但是如果您的目标是不中断正在运行的任务,并让任务有机会完成,那么您可以使用基本的Unix原始概念来实现这一目标。当ECS缩小时,它会告诉Docker守护程序停止容器,并且docker守护程序会向容器中运行的进程发送一个sigterm信号。
每种运行时语言都有一种方法来捕获此信号并添加自定义处理。如果您没有自定义处理,默认处理是让您的流程立即停止,但如果您捕获了sigterm信号,那么您可以改为完成工作然后退出。
例如,在node.js中,您的操作方法如下:
process.on('SIGTERM', function () {
server.close(function () {
process.exit(0);
});
});
此代码使进程保持打开状态,直到服务器关闭所有连接,然后才会退出该进程。
或者,如果您的业务流程需要很长时间,您可以通过使用Amazon Batch(基本上是Amazon ECS上的更高级别服务,用于在群集上运行长时间运行的任务池)来提供更好的服务。响应触发事件)。