我们有一个Azure函数,它应该同时处理多个服务总线触发器,我认为正在发生的事情是它被拆分到多个实例中,这导致了一些并发问题。
我们需要我们的函数充当单例,以便我们可以一次处理一个请求而不会发生任何冲突。从我们在本文(https://learn.microsoft.com/en-us/azure/app-service/webjobs-sdk-how-to#singleton-attribute)中研究的内容来看,我们应该能够做到这一点。
我们的函数如下所示:
[Microsoft.Azure.WebJobs.Singleton(Mode = SingletonMode.Listener)]
[FunctionName("AccountCreatedSubscriber")]
public static void Run([ServiceBusTrigger("accountscontacts-account-created", "license-keys", Connection = "FBISEventBus")]BrokeredMessage message, ILogger log)
{
log.LogInformation($"{{ Message received from accountscontacts-account-created topic }}");
// Do Work
log.LogInformation($"{{ Message sent to account creation handler }}");
}
对于备份,我们在host.json文件中也有这个,
{
"serviceBus": { "maxConcurrentCalls": 1 }
}
但无论出于何种原因,我们的函数仍然并行运行。有什么想法吗?
-
如果函数在消耗计划中,请在应用程序设置中将
WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT
设置为1
。 -
在门户中检查 Azure 函数运行时版本(平台功能>函数应用设置)。如果为 ~2,则需要修改 host.json 中的服务总线设置,如下所示。
{ "version": "2.0", "extensions": { "serviceBus": { "messageHandlerOptions": { "maxConcurrentCalls": 1 } } } }
测试 我得到以下工作:
- 如果函数在消耗计划中,请在应用程序设置中将WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT设置为 1。
- [Microsoft.Azure.WebJobs.Singleton(Mode = SingletonMode.Function)]
此外,由于我们只有一个实例在运行(由于 WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT = 1),正在运行的实例共享相同的静态变量。