Azure DevOps部署Java Service Bus Trigger Functions时如何优雅重启并前置检测状态
方案核心逻辑
先切断新消息流入,等待存量正在处理的消息全部执行完成后再触发部署,避免重启中断运行中的任务。
操作步骤
第一步:禁用触发器停止接收新消息
执行Azure CLI命令禁用指定Service Bus触发器函数,不再接收新的队列消息:az functionapp config appsettings set --name <函数应用名称> --resource-group <资源组名称> --settings AzureWebJobs.<触发器函数名>.Disabled=true
如果要全局禁用所有触发器,可以直接停止函数应用:az functionapp stop --name <函数应用名称> --resource-group <资源组名称>第二步:校验存量消息处理状态
通过Azure CLI查询Service Bus队列的核心指标,确认无正在处理的消息:az servicebus queue show --name <队列名称> --namespace <Service Bus命名空间名称> --resource-group <资源组名称> --query "{待处理活跃消息数:countDetails.activeMessageCount,死信消息数:countDetails.deadLetterMessageCount,计划消息数:countDetails.scheduledMessageCount}"
连续3次(每次间隔1分钟)查询结果中待处理活跃消息数为0,即说明所有已接收的消息已经处理完成。
如果需要更精准的锁定消息校验,可以调用监控指标查询接口:az monitor metrics list --resource <Service Bus命名空间资源ID> --metric "Messages Locked" --aggregation Average --interval 1m
返回的指标平均值为0即可确认没有处于锁定状态、正在被函数处理的消息。第三步:执行部署操作
确认无运行中任务后,正常执行函数应用的部署流程。第四步:恢复服务
部署完成后重新启用触发器/启动函数应用:az functionapp config appsettings set --name <函数应用名称> --resource-group <资源组名称> --settings AzureWebJobs.<触发器函数名>.Disabled=false
或az functionapp start --name <函数应用名称> --resource-group <资源组名称>
补充优化配置
针对Java runtime函数,可以提前配置优雅关机参数,预留足够的消息处理缓冲时间:
在函数应用的配置项中添加FUNCTIONS_SHUTDOWN_GRACE_PERIOD_MS=30000,函数触发关机时会最多等待30秒让正在运行的任务执行完成。
内容的提问来源于stack exchange,提问作者11ohina017

