[英]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.