作为单独实例运行的 Singleton Azure 函数

tok*_*709 4 c# concurrency azure azure-functions

我们有一个 Azure 函数,它应该同时处理多个服务总线触发器,我假设正在发生的是它被拆分到多个实例中,这在我们端导致了一些并发问题。

我们需要我们的函数充当单例,以便我们可以一次处理一个请求而不会发生任何冲突。根据我们在本文 ( https://docs.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 }}");
}
Run Code Online (Sandbox Code Playgroud)

为了备份,我们的 host.json 文件中也有这个,

{
  "serviceBus": { "maxConcurrentCalls": 1 }
}
Run Code Online (Sandbox Code Playgroud)

但无论出于何种原因,我们的功能仍在并行运行。有任何想法吗?

Jer*_*Liu 10

  1. 如果您的功能在消费计划中,WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT1应用程序设置中设置为

  2. 在门户中检查您的 Azure Function 运行时版本(平台功能 > 函数应用设置)。如果是~2,我们需要修改host.json中的服务总线设置,如下所示。

    {
        "version": "2.0",
        "extensions": {
            "serviceBus": {
                "messageHandlerOptions": {
                   "maxConcurrentCalls": 1
                }
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)