【问题标题】:Singleton Azure Function RabbitMQ Trigger单例 Azure 函数 RabbitMQ 触发器
【发布时间】:2021-03-05 07:59:57
【问题描述】:
我正在开发一个新的 C# Azure 持久函数,当新的 XML 消息发布到队列时,它使用 RabbitMQ 绑定作为触发器。 starter 函数根据 XML 消息的内容启动两个编排函数之一。
我希望启动器函数确保在任何时候只有一个给定编排类型的实例运行。因此,编排类型 A 和编排类型 B 的单个实例同时运行是可以的;但绝不是 A 型或 B 型的两个实例。
有一个很好的文档here 描述了如何查询编排状态。如果启动器确定相关类型的编排当前正在运行,我不确定如何处理 RabbitMQ 绑定接收到的新消息?
【问题讨论】:
标签:
azure-functions
azure-durable-functions
【解决方案1】:
我能够用几个掘金解决这个问题。在 host.json 文件中,我将 prefectchCount 设置为 1:
"extensions": {
"rabbitMQ": {
"prefetchCount": 1
}
在编排启动器代码中(由接收到来自 RabbitMQ 的消息触发)我循环直到没有编排实例在运行,然后开始一个新的:
while (runningInstances.DurableOrchestrationState.Where
(x => x.Name == PortfolioActivationOrchestration
&& x.RuntimeStatus == OrchestrationRuntimeStatus.Running).Count() > 0)
{
_sl.LogInfo("Going to wait for PortfolioActivationOrchestration to complete");
Thread.Sleep(1000);
runningInstances = await starter.ListInstancesAsync(
noFilter,
CancellationToken.None);
}
await starter.StartNewAsync(ClientActivationOrchestration, propBag);