如何防止 Azure webjobs 在 Azure 网站生产 <--> 暂存槽中被交换

How to prevent Azure webjobs from being swapped in Azure website production <--> staging slots

我有一个 Azure 网站,其中包含多个实例的生产和暂存槽。

我 运行 网站上有几个 Azure webjobs,其中一些是触发的,另一些是连续的。

我知道触发的网络作业只会 运行 一次。

我当前的设置是:

我注意到当我交换生产和暂存时,webjobs 也被交换了! 当我将一个新的 webjob 部署到生产环境并随后进行网站部署和交换时,我意识到了这一点,新部署的 webjob 不再在生产槽中!

我的问题:

  1. 是否可以防止 webjobs 在生产和暂存之间交换(webjobs 是与网站完全不同的代码片段)

  2. webjobs到底交换了什么?二进制文件?日程?两者 ?

  3. 我如何防止所有网络作业 运行在暂存槽上?我的网络作业不需要高可用性,我可以轻松地离线测试它们。

  4. 如果我 VS 将 webjobs 部署到暂存槽并进行交换,那么当前的暂存槽将缺少已部署的 webjob,我将在下次网站更新时丢失它,所以我应该在哪里部署我的网络作业?

有一个 related thread 但它假设 webjob 与我目前没有的网站同时部署。

我真的很喜欢网站和webjobs,但似乎与持续独​​立部署webjobs和网站有关的故事被打破了。

非常感谢您的建议!

谢谢

Azure 网站部署槽不是一个容易理解的概念,与 WebJobs 一起变得有点困难。

我建议阅读以下内容 post 以更好地了解部署槽 - http://blog.amitapple.com/post/2014/11/azure-websites-slots/(包括有用信息的评论部分)

要更好地了解 WebJobs 的工作和部署方式,请参阅此 post - http://blog.amitapple.com/post/74215124623/deploy-azure-webjobs/

重要的是要了解:

  1. 交换部署槽时,您实际上是在两个槽之间交换了网站的 content/files。
  2. WebJobs 是网站内容的一部分。

因此,当您交换插槽时,您实际上交换了包括 WebJob 在内的网站文件。

Note it is a bad practice to deploy a WebJob directly and not as part of your website files/repository, this is probably the cause of issues you are having.

要防止 WebJobs 在暂存槽上 运行,您可以添加一个名为 WEBJOBS_STOPPED 的应用程序设置并将其设置为 1(在 Azure 门户中)。 (source)。确保此应用设置粘在插槽中,否则它会传播到生产插槽。

这是 Amit 使用 PowerShell 对 #3 的回答,

Function Disable-AzureSlotJobs($SiteName, $Slot = 'staging')
{
    $site = Get-AzureWebsite -Name $SiteName -Slot $Slot
    $site.AppSettings.WEBJOBS_STOPPED = "1"
    Set-AzureWebsite -Name $SiteName -Slot $Slot -AppSettings $site.AppSettings
    Set-AzureWebsite -Name $SiteName -SlotStickyAppSettingNames @("WEBJOBS_STOPPED")
}

'MySite1', 'MySite2', 'MySite3' | % { Disable-AzureSlotJobs $_ }

到目前为止,解决此问题最简单的方法是为您的 Web 作业创建一个单独的 Web 应用程序。只需将 Worker Web App 置于同一个 Azure 服务计划中,您将在同一台计算机上拥有两个单独的 Web 应用程序 运行。

网络应用 网络应用工作者