Azure Durable Functions 的 Activity 函数超时
Timeout in an Activity Function of Azure Durable Functions
在我的 activity 函数中我正在这样做
do {
await timeout(500);
} while (await getStatus() === false);
其中,
function timeout(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
getStatus()
是一个函数,它执行 get
请求以查看其他服务中的进程是否完成以及 returns true
或 false
基于此。
我需要 activity 函数等待其他服务中的进程完成。但是 activity 函数执行默认限制为 5 分钟。
根据不同的情况,我的 getStatus()
可能需要超过 2-3 小时或更长时间才能到达 return true
。
我可以在这里做什么?有什么建议吗?
您有两个选择:
选项 A:使用监视器模式 + 倒带
您能否将 getStatus
代码拆分为另一个 Activity 函数?如果是,则假设如下:
ActivityFunction_A
- 包含轮询 getStatus()
的 do-while 循环之前的代码
ActivityFunction_B
- 包含用 maximum execution time of 10 minutes.
轮询 getStatus
的代码
ActivityFunction_C
- 包含 getStatus
returns TRUE
之后的代码
您现在可以编排工作流程序列
ActivityFunction_A => ActivityFunction_B => ActivityFunction_C
使用 Monitor 模式。
由于 Activity 函数中的任何一个都可能失败或超时,并且执行每个 activity 函数都有潜在的副作用,您还应该使用 Rewind 功能(当前在预览中)仅从序列中第一个失败的 Activity 函数开始倒带和重播。
选项 B:使用应用服务计划
如果您的工作流程确实不需要动态扩展到很多实例,您可以将您的函数迁移到 App Service Plan with AlwaysOn 开启。
在我的 activity 函数中我正在这样做
do {
await timeout(500);
} while (await getStatus() === false);
其中,
function timeout(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
getStatus()
是一个函数,它执行 get
请求以查看其他服务中的进程是否完成以及 returns true
或 false
基于此。
我需要 activity 函数等待其他服务中的进程完成。但是 activity 函数执行默认限制为 5 分钟。
根据不同的情况,我的 getStatus()
可能需要超过 2-3 小时或更长时间才能到达 return true
。
我可以在这里做什么?有什么建议吗?
您有两个选择:
选项 A:使用监视器模式 + 倒带
您能否将 getStatus
代码拆分为另一个 Activity 函数?如果是,则假设如下:
ActivityFunction_A
- 包含轮询getStatus()
的 do-while 循环之前的代码
ActivityFunction_B
- 包含用 maximum execution time of 10 minutes. 轮询 ActivityFunction_C
- 包含getStatus
returnsTRUE
之后的代码
getStatus
的代码
您现在可以编排工作流程序列
ActivityFunction_A => ActivityFunction_B => ActivityFunction_C
使用 Monitor 模式。
由于 Activity 函数中的任何一个都可能失败或超时,并且执行每个 activity 函数都有潜在的副作用,您还应该使用 Rewind 功能(当前在预览中)仅从序列中第一个失败的 Activity 函数开始倒带和重播。
选项 B:使用应用服务计划
如果您的工作流程确实不需要动态扩展到很多实例,您可以将您的函数迁移到 App Service Plan with AlwaysOn 开启。