azure - 等待 azure 函数持久编排完成
问题描述
目前正在从事一个项目,我正在使用存储队列来提取要处理的项目。存储队列触发功能正在从队列中提取项目并启动持久编排。通常,根据文档,存储队列会并行提取 16 条消息(默认情况下)进行处理(https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-queue),但是由于编排刚刚开始(简单而快速的过程),如果队列中有很多消息,我最终会同时运行很多编排。我希望能够启动编排并等待它完成,然后再提取下一批消息进行处理,以避免我的系统过载。我想出并且似乎可行的解决方案是:
public class QueueTrigger
{
[FunctionName(nameof(QueueTrigger))]
public async Task Run([QueueTrigger("queue-processing-test", Connection = "AzureWebJobsStorage")]Activity activity, [DurableClient] IDurableOrchestrationClient starter,
ILogger log)
{
log.LogInformation($"C# Queue trigger function processed: {activity.ActivityId}");
string instanceId = await starter.StartNewAsync<Activity>(nameof(ActivityProcessingOrchestrator), activity);
log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
var status = await starter.GetStatusAsync(instanceId);
do
{
status = await starter.GetStatusAsync(instanceId);
} while (status.RuntimeStatus == OrchestrationRuntimeStatus.Running || status.RuntimeStatus == OrchestrationRuntimeStatus.Pending);
}
它基本上接收消息,启动编排,然后在 do/while 循环中等待状态为 Pending 或 Running 。我在这里遗漏了什么还是有更好的方法(我在网上找不到太多)。提前感谢您的意见或建议!
解决方案
这可能不起作用,因为您可能会遇到超时导致重复的编排运行,或者只是强制您的函数应用向外扩展,从而完全破坏代码的目的。
相反,您可以依赖Durable Functions 附带的并发限制。虽然队列触发器会将编排运行排队,但只有定义的最大值会在函数的单个实例上随时运行。
这仍然会导致您的函数应用向外扩展,因此您在设置此限制时也必须考虑这一点,您还可以设置WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT
应用设置来控制函数应用可以向外扩展的实例数。
推荐阅读
- java - 使用 Varargs 调用方法时出现 javassist.CannotCompileException
- c# - C# 编译成程序集。为什么运行更少的汇编指令需要更长的时间?
- asp.net-core - 带有输入和表单的 AJAX 选项卡 .Net Core
- python - 如何将变量放入 geolocator.reverse() 函数?
- java - 如何在 HTTP 请求中发送 java 对象?
- mongodb - Go 在使用 docker 时无法连接到 Mongo 容器
- python - 如何合并字典列表
- python - Seaborn图中x轴标签的间距
- python - discord.py 如何组织帮助命令
- javascript - React-Leaflet TypeError:无法读取 null 的属性“lat”