繁体   English   中英

等待 azure function 持久编排完成

[英]Waiting for an azure function durable orchestration to complete

目前正在从事一个项目,我正在使用存储队列来挑选要处理的项目。 存储队列触发 function 正在从队列中拾取项目并启动持久编排。 通常根据文档,存储队列会并行处理 16 条消息(默认情况下)( https://learn.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。 我在这里遗漏了什么或者有更好的方法吗(我在网上找不到太多)。 提前感谢您的意见或建议!

这可能行不通,因为您可能会遇到超时导致重复的编排运行,或者只是强制您的 function 应用程序横向扩展,从而完全破坏您的代码的目的。

相反,您可以依赖 Durable Functions 附带的并发限制 虽然队列触发器会将编排运行排队,但只有定义的最大值会随时在 function 的单个实例上运行。

这仍然会导致您的 function 应用程序向外扩展,因此您在设置此限制时也必须考虑到这一点,您还可以设置WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT应用程序设置来控制您的 function 应用程序可以扩展到多少个实例。

可能是 Function 应用程序的内置扩展限制不会减少下游服务的负载,因为它是针对每个应用程序的,只会导致应用程序扩展得更多。 然后需要的是所有应用程序实例都遵守的分布式最大实例数。 我已将此功能构建到我的 Durable Function 编排应用程序中,其中包含一个 scaleGroupId 及其最大实例数。 它有一个 Api 调用来保存此信息,scaleGroupId 是一个字符串,可以设置为任何描述您想要防止超载的资源的字符串。 这是我的可以执行此操作的应用程序:

微流

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM