如何构建弹性 Azure Batch 应用程序?

How to structure an elastic Azure Batch application?

我正在为一个项目评估 Batch,虽然它看起来可以满足我的要求,但我不确定我的假设是否真的正确。

我基本上是来自队列的工作 运行ner。当前的解决方案有效,但当节点池缩小时,它只会盲目地杀死机器。我正在寻找一些东西,在缩小规模时,将允许当前 运行 宁的作业完成,然后 然后 从池中删除节点。如果可能发生峰值(并且不关闭这些节点),我还想抢先增加池大小。如果有意义的话,我可以从外部调整池大小(到目前为止似乎是最好的选择)。

我目前的想法是每个节点有一个池和一个作业和任务,并且该任务在循环中侦听队列中的消息并处理它们。在迭代计数 and/or 时间限制后,它关闭,从池中删除该节点。如果池大小没有改变,我想用一个新节点替换那个节点。如果池是 sh运行k,它就应该消失。如果池大小增加,新节点应该 运行 并启动任务。

我不打算 运行ning 一些东西来不断地添加池,或者向池中添加节点,或者向作业添加任务,尽管我可能会有一些东西可以根据队列定期设置池大小长度或类似的东西。我宁愿 而不是 做的是 "there are 10 things in the queue, add a pool with x nodes, then delete it".

这可能吗?还是我的预期不正确?到目前为止,从阅读文档来看,它似乎应该是可行的,而且我有一个简单的任务在工作,但我不确定缩放机制或确切如何构建 tasks/jobs/pools.

这是一种利用 Azure Batch 的优势并实现您所描述的目标的可能方法。

使用 JobManagerTask 创建您的工作,监控您的队列中的传入工作,并为您的工作负载的每个项目添加一个 new 批处理任务。每个任务将处理一个工作,然后退出。

Batch Scheduler 然后负责将任务分配给计算节点。它还可以负责重试失败的任务,等等。

使用 AutoScale formula 配置池以动态调整池大小以满足负载。您的公式可以指定 taskcompletion 以确保在删除任何一个计算节点之前完成任务。

如果您的工作负载峰值是可预测的(例如,每天上午 9 点),您的 AutoScale 表达式可以按预期扩展您的池。如果这些峰值不可预测,您的外部监控(或您的 JobManager)可以随时更改 AutoScale 表达式以适应。

如果合适,您的作业管理器可以在添加完所有必需的任务后终止;将 onAllTasksComplete 设置为 terminatejob,确保您的工作在 所有任务完成后完成。

单个池可以处理来自多个作业的任务,因此如果您有多个并发工作负载,它们可以共享同一个池。如果您希望首先处理某些作业,您可以为作业的 priority 赋予不同的值。