2015-06-26 38 views
16

我有一个带有多个实例的生产和临时插槽的Azure网站。如何防止在Azure网站生产中交换Azure webjobs <-->分段插槽

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

我明白触发的webjobs只会在一个实例上运行一次。

我目前的设置是:

  • 生产现场没有比从登台

  • 分期的网站交换其他部署是建立以持续部署从到位桶

  • Webjobs从内部署VS发布到使用“发布到Azure”的制作槽(因为AFAIK不支持基于时间表的网页作业的连续部署)

  • 的网站的VS解决方案是从含VS解决方案不同webjobs

我注意到,当我换的生产和分期,webjobs也换! 我意识到这一点时,我已经部署了一个新的webjob生产,随后进行网站部署,然后进行交换,新部署的webjob不再处于生产槽中!

我的问题:

  1. 是可以防止webjobs从生产之间的交换和分期(webjobs真的完全不同的代码片段不是网站)

  2. 到底是换了webjobs什么?二进制文件?时间表?两者?

  3. 我该如何阻止所有webjobs在临时插槽上运行?我的网络作业不需要高度可用,我可以轻松地在线下测试它们。

  4. 如果我VS将webjobs部署到插槽并进行交换,那么当前的临时插槽将缺少部署的webjob,当我执行我的下一个网站更新时我将丢失它,因此我应该在哪里部署我的网络工作?

有一个related thread,但它假定webjob与一个网站,是不是我有什么目前同时部署。

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

真的会很感激的建议!

感谢

回答

23

Azure的网站部署插槽并不是一件容易的概念来理解,与WebJobs在一起就变得更加困难一点。

我建议您阅读下面的帖子得到有关部署插槽更好的理解 - http://blog.amitapple.com/post/2014/11/azure-websites-slots/(包括有用信息的评论部分)

要获得WebJobs如何工作更好地了解和部署看到这个帖子 - http://blog.amitapple.com/post/74215124623/deploy-azure-webjobs/

重要的是要认识到:

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

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

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

为了防止WebJobs从您可以添加一个名为WEBJOBS_STOPPED一个应用程序设置,并将其设置为1(在蔚蓝的门户网站)的升级插槽运行。 (source)。确保这个应用程序设置为粘到插槽,否则它会传播到生产插槽。

+0

感谢您的回应阿米特。 我不知道直接部署一个WebJob是不好的做法,Visual Studio Azure集成实际上鼓励它在VS中的WebJob项目中使用“发布到Azure”按钮。看起来至少它不应该让它很容易遵循'坏习惯' 有什么地方可以向团队提供反馈? Git部署对于WebJobs和CloudServices来说是一个巨大的胜利。 这会稍微削弱故事,因为这意味着需要重新部署网站来更新WebJob。 –

+0

“发布到Azure”的WebJob与网站相同,问题的做法是将git部署和“发布到Azure”(msdeploy)混合在一起,最好使用一种部署方法。 –

+0

明白了,你知道我是否将我所有的webjobs添加到与我的网站(这是git部署)相同的VS解决方案中,当我在webjob中进行更改提交时,是否会重新部署我的网站只有更新是一个webjob?那些尚未更新的其他webjobs呢?我担心部署将花费多长时间,如果它的一个整体解决方案与所有webjobs和网站。 –

1

这里是Amit的答案#3使用PowerShell中,

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 $_ } 
2

的迄今为止最简单的解决这个问题是有一个单独的Web应用程序为您的Web工作。只需将Worker Web App放在相同的Azure服务计划中,您就可以在同一台计算机上运行两个单独的Web Apps。

web应用程序 web-app的工人

+1

如果您没有任何/许多应用程序设置,这很有用。不幸的是,对于我来说,我已经达到了60个左右。我不想记得同时保持两个应用程序设置同步 – viggity

+0

手动设置应用程序设置是一个非常冒险的做法,请考虑使用ARM模板自动化它们。 –