我最近刚注意到,Azure功能在时间轴上的某个地方动态定价层上获得了5分钟的超时。由于我一直在忙着做其他的事情,所以在我的雷达下飞行,直到我注意到一些长时间运行的功能没有完成。
所以我去挖掘,发现有两个定价层 - 基于动态和应用服务。该网站对整个概念有点模糊,但据我所知,这就是它的立场:
动态:由用户按使用时间和内存分配计费。 5分钟超时(现在一次长时间运行无用)。
应用服务:基本或标准层虚拟机,全时运行,等待触发器。没有超时可言。
现在第一个令我失望的是,因为我看到作为我的工作的解决方案的功能需要每年解雇一次或两次,但是需要一两天才能完成(用于导出的全面备份和数据打包)。 / p>
第二个让我困惑的是 - 这是否意味着,无状态功能现在作为网络应用程序运行,我将被收取费用?如果是这种情况,那么函数的整个概念现在对我来说是无用的,除非我实现了Cell处理器,在触发器上触发80000个函数实例以按时完成工作。如果可能的话。
有人可以解释功能定价背后的模型以及我的问题的最佳解决方案是什么?
谢谢。
答案 0 :(得分:4)
您正在使用Azure批处理服务。
基本上,您可以根据需要调整所需的计算资源 - 并且您只需为您使用的计算时间付费,批处理服务本身(提供各种优点,例如错误检测,重试,自动缩放)不会产生额外费用。 (顺便说一下,它有自己的API - 如果需要,你可以完全自动化它)
您可以在开始执行工作之前在池中的每个VM上安装自定义软件。
您可以根据可自定义的规则自动缩放批量服务,也可以只创建固定大小的池并手动缩放。
https://azure.microsoft.com/en-gb/services/batch/
更新 - 根据对this GitHub问题的评论,如果您的功能应用程序正在使用现有的应用服务计划,则超时不适用。看起来,动态选项或“消耗计划”超时与底层平台VM实例的超时有关。因此,这可能是另一条路线:支付应用服务计划,然后您可以使用功能应用程序的优点而不会超时。
答案 1 :(得分:1)
功能旨在处理短期任务(5分钟以内)。但有一些解决方法。您可以创建ARM模板以使用Web App服务层部署功能应用程序,并在处理完成后将其删除。您可以使用webjobs而不是功能(但您仍然需要为Web App付费)。
答案 2 :(得分:1)
正如这个帖子上的某个人所说,如果您的流程使用频率较低,那么您应该尝试查看azure自动化,而且需要花费几天的时间才能完成。
没有完全知道规模(文件数量/文件和备份的源和目标)您可以将解决方案分解为更小的块(tasks =>函数)并在单独的应用程序计划中部署块
主
工人
从货币的角度来看,在一个消费计划中,你会被大约Gb / s(内存和使用的执行时间)所控制,主机阻止长时间运行执行死刑。
希望这有帮助
答案 3 :(得分:1)
这个帖子应该更加清晰。首先,如果您的函数调用需要一些时间才能完成,那么您将希望它是异步的。其次,如果你确实使它异步,它将在5分钟后不会超时。
试一试:P
DateTime d = DateTime.Now;
Task t = new Task(() =>
{
log.Info("Doing long task");
for (int cnt = 0; cnt < 100; cnt++)
{
log.Info(DateTime.Now.Subtract(d).ToString());
System.Threading.Thread.Sleep(10000);
}
});
t.Start();
我目前按照我的帖子在消费计划上运行它们的时间超过5分钟。有一个超时,但是由于我运行时间超过5,所以显然没有执行时间分钟。超时是在执行函数的调用机制中。如果使其为异步,则调用者返回并继续执行该函数。将长时间运行的任务放在与调用线程/进程不同的线程/进程上是一种常见做法。保持功能平台的编排层不会长时间阻塞是有道理的。您不应该为长时间运行的功能阻止调用层,因为它会严重降低平台性能。