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

问题描述 投票:0回答:3

我们有一个 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 }
}

但无论出于何种原因,我们的函数仍然并行运行。有什么想法吗?

c# azure concurrency azure-functions
3个回答
14
投票
  1. 如果您的功能属于消耗计划,请在

    应用程序设置
    中将
    WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT
    设置为1

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

    {
        "version": "2.0",
        "extensions": {
            "serviceBus": {
                "messageHandlerOptions": {
                   "maxConcurrentCalls": 1
                }
            }
        }
    }
    

0
投票

测试我得到以下工作:

  1. 如果您的功能属于消耗计划,请在应用程序设置中将 WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT 设置为 1。
  2. [Microsoft.Azure.WebJobs.Singleton(模式 = SingletonMode.Function)]

此外,由于我们只运行一个实例(感谢 WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT = 1),因此正在运行的实例共享相同的静态变量。


0
投票

使用模式作为 SingletonMode.Function 模式或者不传递模式,默认情况下它将采用 Function 模式。 [Microsoft.Azure.WebJobs.Singleton(模式 = SingletonMode.Function)]

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.