首页 > 解决方案 > 如何构建弹性 Azure Batch 应用程序?

问题描述

我正在为一个项目评估 Batch,虽然它似乎会做我正在寻找的东西,但我不确定我的假设是否真的正确。

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

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

我不打算运行不断添加池或向池中添加节点或向作业添加任务的东西,尽管我可能会根据队列长度或类似的东西定期设置池大小。我宁愿不做的是“队列中有 10 个东西,添加一个带有 x 个节点的池,然后删除它”。

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

标签: azure-batch

解决方案


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

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

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

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

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

如果合适,您的工作经理可以在添加了所有必需的任务后终止;将onAllTask​​sComplete设置为terminatejob,确保您的工作在所有任务完成完成。

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


推荐阅读