Azure Durable Functions清历史后archive函数仍异常触发
问题根因
PurgeInstanceHistoryAsync 只会清理Durable Task框架存在表存储里的编排实例状态、执行历史记录,根本不会碰存储队列里待处理的活动调用消息,这就是你删完所有实例记录还是会自动触发archive的核心原因。
你日志里archive的触发Reason显示为(null),就是队列残留孤儿消息的典型表现:之前archive执行失败时,对应的活动调用消息早就被投递到Durable绑定的工作项队列里了,框架的重试机制会让这些消息反复入队等待执行。这些消息和实例历史是分开放的,你删表记录的时候完全没触碰到队列里的内容。
从时间线也能对上:你刚删完49个实例40多秒,应用连上存储就批量拉到了队列里压着的消息,一下并发触发了10次archive。这些消息对应的原编排实例已经被你删掉了,执行完也没有编排器接收返回结果,属于完全无效的游离调用。
解决步骤
- 找到函数配置里
AzureWebJobsStorage对应的存储账号,找到Durable用的两类队列:- 工作项队列,默认名是
durabletask-workitems - 控制队列,默认前缀是
durabletask-control-,一般有0到多个分片
- 工作项队列,默认名是
- 直接把这些队列里的积压消息全清空,这才是异常触发的源头,清完重启就不会再乱触发
archive了 - 如果是本地调试用的Azurite(老版本叫Azure Storage Emulator),直接重置模拟器的所有持久化数据,比写代码清理干净得多
- 后续做历史清理的时候记着:
PurgeInstanceHistoryAsync管不到队列里的残留消息,碰到活动执行异常重试、实例意外中断的情况,一定要同步检查队列有没有剩孤儿消息,别只删表存储里的记录。
内容的提问来源于stack exchange,提问作者johnykes
相关产品推荐
相关产品推荐

