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

问题描述 投票:0回答:4

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

我在网站上运行多个 Azure Web 作业,其中一些是触发的,另一些是连续的。

我了解触发的网络作业只会在一个实例上运行一次。

我当前的设置是:

  • 生产站点除了从临时站点交换之外没有任何部署

  • 暂存网站已设置为从 bitbucket 持续部署

  • 使用“发布到 Azure”将 Web 作业从 VS 内部署到生产槽(因为据我所知,不支持基于计划的 Web 作业的持续部署)

  • 网站的VS解决方案与包含webjobs的VS解决方案不同

我注意到当我交换制作和登台时,网络作业也会交换! 当我将一个新的 webjob 部署到生产环境并随后进行网站部署并进行交换时,我意识到这一点,新部署的 webjob 不再位于生产槽中!

我的问题:

  1. 是否可以阻止网络作业在生产和登台之间交换(网络作业实际上是与网站完全不同的代码段)

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

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

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

有一个相关线程,但它假设网络作业与网站同时部署,而这不是我目前拥有的网站。

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

非常感谢建议!

谢谢

azure-web-app-service azure-webjobs
4个回答
39
投票

Azure 网站部署槽并不是一个容易理解的概念,与 WebJobs 一起使用会变得更加困难。

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

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

重要的是要了解:

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

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

请注意,直接部署 WebJob 而不是作为网站文件/存储库的一部分部署是一种不好的做法,这可能是导致您遇到问题的原因。

要防止 WebJobs 在暂存槽上运行,您可以添加一个名为

WEBJOBS_STOPPED
的应用程序设置,并将其设置为
1
(在 Azure 门户中)。 (来源)。确保此应用程序设置粘在插槽上,否则它将传播到生产插槽。


6
投票

解决此问题的最简单方法是为您的 Web 作业创建一个单独的 Web 应用程序。只需将 Worker Web 应用程序放在同一个 Azure 服务计划上,您就会在同一台计算机上运行两个单独的 Web 应用程序。

网络应用程序 网络应用程序工作者


1
投票

这是 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 $_ }

0
投票

我的解决方案是在部署后、交换插槽和/或启动插槽中的应用程序服务之前从插槽中删除 webjob:

az webapp webjob continuous remove --webjob-name fooJob --name fooApp --resource-group fooApps --slot fooSlot

可以通过使用内联 powershell 脚本添加 Azure CLI 任务来在 Azure DevOps 版本中完成。

© www.soinside.com 2019 - 2024. All rights reserved.