我已经使用WEBJOBS_SHUTDOWN_FILE和here使用取消令牌了解了正常关闭here,所以我理解正常关闭的前提,但是我不确定它们将如何影响WebJobs在处理队列消息的过程中。
所以这是场景:
假设我已经将我的WebJobs连接到git pushes上进行部署,此部署还将触发WebJobs的更新,这(据我所知)将在作业中启动某种关闭工作流程。所以我有一些问题源于此。
非常感谢任何指导!此外,如果除了我提到的那些之外,如果任何人有关于如何处理工作停工的任何其他有用的链接,那么如果你可以分享它们会很棒。
答案 0 :(得分:4)
经过不少的测试,我想我已经找到了问题的答案,希望其他人能从我的经验中获得一些见解。
注意:所有这些方案都是使用.NET控制台应用程序和Azure队列进行测试的,因此我不确定blob或表存储或不同类型的作业文件类型如何处理这些不同的方案。
将作业标记为退出后,正在运行的已触发函数将具有配置的时间量(宽限期)(默认为5秒,但我认为是configurable by using a settings.job file)在他们退出之前完成。如果它们没有在宽限期内完成,则该函数退出。但是,Main()(或者您声明为host.RunAndBlock()的文件)将在host.RunAndBlock()
之后运行任何代码,最长时间为宽限期内剩余的时间(我不确定)如果您使用无限循环而不是RunAndBlock,这将如何工作。至于处理你的功能中的退出,你基本上可以"听"到CancellationToken,您可以传入IsCancellationRequired的触发函数,然后相应地处理它。另外,如果你不自己处理退出,那么你就不是SOL。好哇!见第3点。
如果你不处理戒烟而不是SOL(参见第3点),我认为将你的所有工作包装在你赢得的交易中是个好主意。提交,直到你完全确定工作已经完成。这样,如果您的功能退出中间过程,您就不太可能担心数据损坏。我可以想到一些情况,您可能希望在事务传递时提交事务(例如,批处理作业),但是您需要构建数据或逻辑,以便在作业重新启动后不会重新处理先前处理的实体。
如果你不自己处理工作,你就没有遇到麻烦。我对幕后发生的事情的理解几乎不存在,但我对结果非常肯定。如果一个函数正处理一个队列消息,并且在它完成之前被迫退出,那就不要害怕了!当作业抓取要处理的消息时,它将基本上将其隐藏在队列中一段时间。如果您的功能在处理邮件时退出,则该邮件将变为可见"再过一段时间后,它将被重新抓取并针对刚刚部署的可能更新的代码运行。
所以我对#4的调查结果有90%的信心。我说这是因为试图测试它涉及窗口之间的快速切换,而实际上并不完全确定某些部分发生了什么。但这就是我发现的结果:如果队列在宽限期b4中添加了一条新消息,那么作业就会退出,我认为可能会发生以下两种情况之一:如果函数没有在作业退出之前轮询该队列,然后该消息将保留在队列中,并在作业重新启动时抓取该消息。但是,如果函数DOES抓取消息,它将被视为与被中断的任何其他消息相同:它将变为可见"再次出现在队列中,重新开始工作。
这几乎总结了一下。我希望其他人会觉得这很有用。如果您想要解释任何此类内容,请告诉我,我们将很乐意尝试。或者,如果我充满了它并且你有很多更正,那么这些可能更受欢迎!