【问题标题】:How to prevent Azure webjobs from being swapped in Azure website production <--> staging slots如何防止 Azure webjobs 在 Azure 网站生产中被交换 <--> 暂存槽
【发布时间】:2015-06-26 02:49:17
【问题描述】:

我有一个带有多个实例的生产和暂存槽的 Azure 网站。

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

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

我目前的设置是:

  • 生产站点除了从登台交换之外没有部署

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

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

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

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

我的问题:

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

  2. 究竟是什么换成了网络作业?二进制文件?日程?两者都有?

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

  4. 1234563部署我的网络作业?

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

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

非常感谢您的建议!

谢谢

【问题讨论】:

    标签: azure-web-app-service azure-webjobs


    【解决方案1】:

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

    我建议阅读以下帖子以更好地了解部署槽 - http://blog.amitapple.com/post/2014/11/azure-websites-slots/(包括 cmets 部分以获取有用信息)

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

    理解这一点很重要:

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

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

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

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

    【讨论】:

    • 感谢您的回复阿米特。我不知道直接部署 WebJob 是 bad 做法,Visual Studio Azure 集成实际上鼓励它在 VS 的 WebJob 项目中使用“发布到 Azure”按钮。看起来至少它不应该让关注bad practice 变得那么容易。有什么地方我可以向团队提供反馈吗? Git 部署对我来说是 WebJobs 与 CloudServices 的巨大胜利。这稍微弱化了故事,因为这意味着需要重新部署网站来更新 WebJob。
    • WebJob 的“发布到 Azure”与网站相同,有问题的做法是将 git 部署和“发布到 Azure”(msdeploy)混合在一起,最好使用一个部署方法。
    • 知道了,你知道我是否将我所有的 webjobs 添加到与我的网站相同的 VS 解决方案中(这是 git 部署的),当我对 webjob 的更改进行提交时,它会继续吗即使唯一的更新是网络作业,也要重新部署我的网站?其他未更新的 webjobs 呢?如果它是一个包含所有网络作业和网站的单一解决方案,我担心部署需要多长时间。
    • 它将构建网络应用程序和网络作业,但仅部署(复制)已更改的文件。
    • @AmitApple,我正在使用设置为1WEBJOBS_STOPPED,但这并没有停止网络作业,它们仍在舞台上运行。你知道这是否真的有效吗?还是它显示为在门户中运行但实际上并未运行?
    【解决方案2】:

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

    网络应用 网络应用工作者

    【讨论】:

    • 如果您没有任何/许多应用程序设置,这很有用。对我来说不幸的是,我有大约 60 个。我不想记住让两个应用设置保持同步
    • 手动设置应用程序设置是一种非常危险的做法,请考虑使用 ARM 模板将它们自动化。
    • 对于这种情况,我必须在两个地方维护配置设置。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      • 2012-01-15
      相关资源
      最近更新 更多