重新部署网站时,在连续Azure WebJob上运行进程会发生什么?

时间:2015-01-27 22:43:11

标签: azure-webjobs azure-webjobssdk

我已经使用WEBJOBS_SHUTDOWN_FILE和here使用取消令牌了解了正常关闭here,所以我理解正常关闭的前提,但是我不确定它们将如何影响WebJobs在处理队列消息的过程中。

所以这是场景:

  1. 我有一个WebJob,其功能是侦听队列。
  2. 消息已添加到队列,作业开始处理。
  3. 在处理过程中,有人推动开发,触发重新部署。
  4. 假设我已经将我的WebJobs连接到git pushes上进行部署,此部署还将触发WebJobs的更新,这(据我所知)将在作业中启动某种关闭工作流程。所以我有一些问题源于此。

    1. 处理队列消息中间的作业是否会在作业退出之前完成处理消息?或者任何关闭通知基本上被视为“这个婊子即将关闭。如果你没有任何东西可以处理它,你就是SOL。”
    2. 如果我们是SOL,那么处理停机的最佳选择本质上就是将您正在进行的任何操作包装在相当于数据库事务中并实现关闭处理程序,以便在关闭时回滚所有更改?
    3. 如果正在处理队列消息并且WebJob关闭,那么该消息是否会被重新排队?如果没有,这是否意味着我的关机处理程序需要处理重新排队的消息?
    4. 在通知作业需要关闭之后,侦听队列的函数是否有可能再抓取任何队列消息?
    5. 非常感谢任何指导!此外,如果除了我提到的那些之外,如果任何人有关于如何处理工作停工的任何其他有用的链接,那么如果你可以分享它们会很棒。

1 个答案:

答案 0 :(得分:4)

经过不少的测试,我想我已经找到了问题的答案,希望其他人能从我的经验中获得一些见解。

注意:所有这些方案都是使用.NET控制台应用程序和Azure队列进行测试的,因此我不确定blob或表存储或不同类型的作业文件类型如何处理这些不同的方案。

  1. 将作业标记为退出后,正在运行的已触发函数将具有配置的时间量(宽限期)(默认为5秒,但我认为是configurable by using a settings.job file)在他们退出之前完成。如果它们没有在宽限期内完成,则该函数退出。但是,Main()(或者您声明为host.RunAndBlock()的文件)将在host.RunAndBlock()之后运行任何代码,最长时间为宽限期内剩余的时间(我不确定)如果您使用无限循环而不是RunAndBlock,这将如何工作。至于处理你的功能中的退出,你基本上可以"听"到CancellationToken,您可以传入IsCancellationRequired的触发函数,然后相应地处理它。另外,如果你不自己处理退出,那么你就不是SOL。好哇!见第3点。

  2. 如果你不处理戒烟而不是SOL(参见第3点),我认为将你的所有工作包装在你赢得的交易中是个好主意。提交,直到你完全确定工作已经完成。这样,如果您的功能退出中间过程,您就不太可能担心数据损坏。我可以想到一些情况,您可能希望在事务传递时提交事务(例如,批处理作业),但是您需要构建数据或逻辑,以便在作业重新启动后不会重新处理先前处理的实体。

  3. 如果你不自己处理工作,你就没有遇到麻烦。我对幕后发生的事情的理解几乎不存在,但我对结果非常肯定。如果一个函数正处理一个队列消息,并且在它完成之前被迫退出,那就不要害怕了!当作业抓取要处理的消息时,它将基本上将其隐藏在队列中一段时间​​。如果您的功能在处理邮件时退出,则该邮件将变为可见"再过一段时间后,它将被重新抓取并针对刚刚部署的可能更新的代码运行。

  4. 所以我对#4的调查结果有90%的信心。我说这是因为试图测试它涉及窗口之间的快速切换,而实际上并不完全确定某些部分发生了什么。但这就是我发现的结果:如果队列在宽限期b4中添加了一条新消息,那么作业就会退出,我认为可能会发生以下两种情况之一:如果函数没有在作业退出之前轮询该队列,然后该消息将保留在队列中,并在作业重新启动时抓取该消息。但是,如果函数DOES抓取消息,它将被视为与被中断的任何其他消息相同:它将变为可见"再次出现在队列中,重新开始工作。

  5. 这几乎总结了一下。我希望其他人会觉得这很有用。如果您想要解释任何此类内容,请告诉我,我们将很乐意尝试。或者,如果我充满了它并且你有很多更正,那么这些可能更受欢迎!