Azure Webjobs 与 Azure Functions:如何选择

Azure Webjobs vs Azure Functions : How to choose

我创建了一些 Azure Webjobs that use triggers and I've just learnt about Azure Functions

据我所知,Azure Functions 似乎与 Azure Webjobs 功能重叠,我很难理解何时在 Function 和 Webjob 之间进行选择:

所以肯定存在价格差异,如果您有现有的网络应用程序 运行ning 您可以将其用于 运行 网络作业而无需任何额外费用,但如果我没有一个现有的网络应用程序,我必须编写代码来触发队列我应该使用网络作业还是函数?

在选择的时候还有什么需要注意的吗?

应用服务中有几个选项。我不会涉及逻辑应用程序或 Azure 自动化,它们也涉及此 space.

Azure Web 作业

This article 老实说是最好的解释,但我会在这里总结一下。

又名按需 WebJobs。计划的 WebJobs 又名。触发的 WebJobs

触发的 Web 作业是 运行 一次调用 URL 或 schedule property is present in schedule.job 时的 Web 作业。 Scheduled WebJobs 只是 WebJobs,它创建了一个 Azure Scheduler Job 来按计划调用我们的 URL,但我们也支持计划 属性,如前所述。

总结:

  • + Executable/Script 按需
  • + 计划执行
  • - 必须通过 .scm 端点触发
  • - 缩放是手动的
  • - 始终需要 VM

连续 Web 作业(非 SDK)

这些作业 运行 永远,我们会在它们崩溃时唤醒它们。您需要启用 Always On 才能使它们正常工作,这意味着 运行将它们设置为基本层及更高层。

总结:

  • +Executable/Script总是运行宁
  • - 需要始终在线 - 基本层及以上
  • - 始终需要 VM

使用 WebJobs SDK 的连续 WebJobs

从 "WebJobs the feature" 的角度来看,这些都不算什么。本质上,我们拥有针对 WebJobs 编写的这个可爱的 SDK,它可以让您基于简单的触发器执行代码。这个以后再说。

总结:

  • +Executable/Script总是运行宁
  • + 更富有 logging/dashboard
  • + 触发器与长 运行ning 任务一起支持
  • - 需要始终在线 - 基本层及以上
  • - 缩放是手动设置的
  • - 开始可能有点累
  • - 始终需要 VM

Azure WebJobs SDK

Azure WebJobs SDK 是一个完全独立于 WebJobs 平台功能的 SDK。它被设计为在 WebJob 中 运行,但实际上可以在任何地方 运行。我们的客户 运行 他们担任工作者角色,甚至在 prem 或其他云中,尽管支持只是尽力而为。

SDK 只是为了让 运行 一些代码更容易响应某些事件并绑定到 services/etc。简单。老实说,这在一些 docs 中得到了最好的涵盖,但它的核心是 "event" + "code" 性质。我们还做了一些很酷的可扩展性工作,但这对于核心目的来说是次要的。

总结:

  • 以上大部分都提到了
  • + 你可以扩展 运行 任何你想要的。完全控制。
  • - HTTP 的东西有点不稳定,但它有效

Azure 函数

Azure Functions 就是为了实现 WebJobs SDK 的核心目的,将其托管为服务,并使其他语言的入门变得容易。我们还在这里引入了 "Serverless" 概念,因为这样做很有意义 - 我们知道我们的 SDK 如何扩展,因此我们可以为您做一些智能的事情。

Azure Functions 是一种非常受管理的体验。我们不支持自带主机。目前,我们不支持自定义扩展,但我们正在对此进行调查。我们对您能做什么和不能做什么有自己的看法,但对于我们支持的事情,它们很巧妙,易于使用和管理。

不过,我们为改进 Functions 所做的大部分 "framework" 工作都是通过 WebJobs SDK 完成的。例如,我们将为 WebJobs 上传一个新的 NuGet,它确实大大提高了日志记录的速度,这对 WebJobs SDK 用户具有巨大的性能优势。在作为 "WebJobs SDK as a Service" 发布 Functions 时,我们确实改善了很多体验问题。

我可能有偏见,因为 Functions 是我们最新最好的,但请随意以我的方式为 Functions 拍摄更多缺点。

我可能最终会发布一个详细说明更多的博客,但我尽量让这个论坛尽可能简洁。

作为基于 WebJobs SDK 的 Azure Functions,它们提供了 WebJobs 中已有的大部分功能,但还具有一些很酷的新功能。

触发器而言 ,除了已经可用于 Web 作业的触发器(例如服务总线、存储队列、存储 Blob、CRON 计划、WebHook、EventHub 和文件云存储供应商),Azure Functions 可以作为 API 触发。并且 HTTP 调用不需要 kudu 凭据,但可以通过 Azure AD 和第三方身份提供程序进行身份验证。

关于 输出 ,唯一的区别是函数可以 return 通过 HTTP 调用时的响应。

两者都支持广泛的多种语言,包括:bash (.sh)、批处理 (.bat / .cmd)、C#、F#、Node.Js、PHP、PowerShell 和 Python.

作为目前处于预览阶段的功能,工具 仍然不理想。但微软正在努力。希望我们在本地开发和测试 Functions 的灵活性与我们目前使用 Visual Studio 为 WebJobs 所做的一样。

Functions 带来的最重要和最酷的优势是可以选择 动态服务计划"Serverless" 模型,其中我们不需要管理 VM 实例或扩展;这一切都为我们管理。此外,由于没有专用实例,我们只需为实际使用的资源付费。

两者之间更详细的比较在这里: https://blog.kloud.com.au/2016/09/14/azure-functions-or-webjobs/

HTH:)

根据 docs Azure Functions 具有以下 WebJobs 没有的功能:

  • 自动缩放(CPU 内存根据运行时确定的需求缩放)
  • 按使用付费定价(消费计划而不是应用服务计划)
  • 更多触发事件(如 WebHooks)
  • 浏览器内开发(Visual Studio 仍然可能)
  • F# 支持

简而言之:Azure Functions 是较新的动物。如果您还没有 App Service 计划,我会选择 Functions,因为从长远来看,我看不出有任何理由说明从 WebJobs 开始会更好(尽管 Functions 工具可能还不够稳定)。

我想对上面那些又长又有点老的帖子再补充两点。如果您在 azure functions 中选择消费计划,以下是限制

如果您想 运行 任何超过 10 分钟的作业,请选择网络作业。 Azure functions,默认运行s只持续5分钟,如果你的进程超过5分钟,那么azure function会抛出超时异常。您可以在 host.json.

增加 超时至 10 分钟

注意:如果您使用的是app service plan azure functions,则没有超时问题。

区分的另一个原因是。如果你使用 azure 函数,那么你的初始启动时间会很慢,因为机器(容器)是动态创建的,一旦使用就被销毁。

为了避免冷启动,azure 函数应用程序发布了高级计划,其中一个实例将一直 运行ning,并且函数应用程序将根据负载开始缩放,您将需要为一个实例付费实例和其他基于消耗的实例。

我意识到这个答案我来晚了,但由于这仍然是 Google 上的热门搜索结果,我想就此主题提供一些指导 成本观点 因为 OP 似乎对成本有一些担忧。这里已经有一些很好的答案,讨论了技术限制和每项服务如何工作的细节,所以我不打算重复这些答案。

如果您确实需要 运行 用于 "free" 的东西(因为您已经为网络应用支付的费用没有额外费用) 那么你有两个选择:

  1. Webjobs - 与您现有的网络应用程序一起部署,并使用与您的网络应用程序相同的资源。使用 webjobs 没有额外的金钱成本,但有一些限制,如前所述,可能会导致您的 web 应用程序的性能成本。
  2. 功能-使用消费计划时,您将获得一定数量的免费执行。在撰写本文时,这个数字实际上相当高,有 100 万次免费执行。但是,100 万的执行限制并不是可能给您带来麻烦的限制;它是 400K GB-s(千兆字节秒)。这基本上是你的函数使用的内存量乘以它 运行s 的秒数的计算(参见 pricing page here 上的官方计算)。您会惊讶于这个免费配额用完的速度有多快。

如果您担心费用但根本不限于免费,那么您有更多选择。

  1. 功能 - 您可以运行在消费计划或应用程序服务计划中以相对便宜的价格。不过请记住,GB-s 计费模型。如果您正在使用消费计划并且经常做 "heavy" 工作 - 您可能会对一笔大账单感到惊讶。
  2. 云服务 - 此选项尚未作为替代方案进行讨论,主要是因为 OP 没有询问。但这也是一个可行的选择。云服务最终只是云中的虚拟机 运行,因此您可以 运行 在它们上面进行任何您需要的后台作业,并且它们可以很好地扩展 up/down (尽管您必须连接自己的触发器对于执行,与 webjobs/functions 相比略有不便)。他们有更多与之相关的初始成本(因为无论您是否使用它,您都需要为每个实例付费)但是如果您的工作需要不断 运行 并且正在做很多 "heavy" 提升,那么云服务可能是更好的选择,因为在我看来,manage/monitor 固定价格的 VM 比执行和千兆字节秒更容易。云服务的另一个好处是您永远不必担心超时或之前答案中提到的其他一些限制。

如果您有兴趣通读一些特定的场景以及为什么我会选择一个(网络作业、函数、云服务)而不是另一个,我最近刚刚在 webjobs vs functions vs cloud services 上写了一篇博客 post .

一个主要的考虑因素是 Azure Functions 在版本 1 之后停止支持完整的 .NET Framework,该版本在 v2.0 中停止,并且在现在的预览版 v3.0 中不会更改。

与此同时,谢天谢地,这种强大的武装方法尚未应用于 Azure WebJobs:

Version 3.x of the WebJobs SDK supports both .NET Core and .NET Framework console apps.

我想说说两者之间的共同点不同点是什么 Azure 函数构建于 AppService 和 WebJobs SDK 之上。 WebJobs SDK 将为您提供更多的使用自由,而 Azure 函数结构更加结构化,开发人员的责任更少。

看共同点的时候都采用面向函数的编程模式, trigger/input/output 的绑定,支持外部库,可以 运行 和本地调试支持运行time 洗漱用品。

差异

|-----------------------|------------------|
|      Functions        |     Web Jobs     |
|-----------------------|------------------|
|Can support HTTP       | Can't support HTTP
|                       |  requests        |
|-----------------------|------------------|
|Supports a variety of  | Traditional .NET |
|languages/tools        | developer        |
|                       | experience       |
|-----------------------|------------------|
|Bindings are configured| Config files are |
|using attributes       | used             |
|-----------------------|------------------|
|Scale is managed by    | Scale is managed |
|Azure                  | by user          |
|-----------------------|------------------|
|Limited control over   |Host can be       |
|host                   |controlled by user|
--------------------------------------------

我总能找到这个问题的一个答案是 您可以在 Azure WebJobs 中自定义主机,但无法自定义 Azure Functions 的主机,

一个例子是 “在 WebJob 中,您可以为调用外部系统创建自定义重试策略。”

无法在 Azure 函数中配置此类策略。