部署期间Function App终止:如何让运行中实例完成执行?
以下是几种能让运行中的长耗时Function App在部署新代码时完成执行的方案:
配置优雅关闭超时
针对消耗计划以外的托管计划(如专用计划、弹性计划),可设置WEBSITE_SHUTDOWN_TIMEOUT应用设置,指定实例收到终止信号后等待现有任务完成的超时时间(单位为秒,最大支持900秒)。对于隔离进程模型的函数,还需配置FUNCTIONS_WORKER_RUNTIME_GRACEFUL_SHUTDOWN_TIMEOUT,控制Worker进程的优雅关闭时长。设置后,部署或槽交换时,平台会先停止向实例发送新请求,等待正在执行的任务完成后再终止实例,超时后才会强制终止。采用隔离进程运行模型
隔离进程模型下,函数代码运行在独立于宿主进程的Worker进程中,平台对这类实例的优雅关闭支持更完善。部署或槽交换时,宿主进程会先通知Worker进程停止接收新请求,并等待Worker进程处理完现有任务(受上述超时配置控制)后再关闭,相比进程内模型更适合长运行任务场景。优化部署槽的使用策略
- 先预热 staging 槽的实例,确保新代码已加载并正常运行;
- 不直接执行完整槽交换,而是通过流量路由逐步将用户流量从生产槽切换到 staging 槽;
- 保留生产槽的实例直到所有长任务执行完成后,再销毁生产槽资源,避免实例被提前终止。
拆分长任务到外部持久化服务
将耗时的业务逻辑从Function App中剥离,通过Azure Queue Storage、Azure Service Bus等消息队列传递任务请求,由独立的后台服务(或另一个专门处理长任务的Function)来执行。此时部署Function App仅更新请求接收逻辑,正在运行的长任务在外部服务中不受部署影响,可自然完成执行。使用Durable Functions
Durable Functions通过持久化机制保存任务状态,即使当前实例被终止,任务也能在新实例上恢复执行。若需当前实例完成任务而非恢复,结合优雅关闭配置,Durable Functions的长运行编排任务可在部署时完成当前执行步骤后再进行更新。
内容的提问来源于stack exchange,提问作者Asfaqur FAQ

