【问题标题】:Singleton Azure function running as separate instances单例 Azure 函数作为单独的实例运行
【发布时间】:2019-01-02 04:20:39
【问题描述】:

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

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

{
  "serviceBus": { "maxConcurrentCalls": 1 }
}

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

【问题讨论】:

    标签: c# azure concurrency azure-functions


    【解决方案1】:
    1. 如果您的函数在消耗计划中,请将Application settings 中的WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT 设置为1

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

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

    【讨论】:

    • 抱歉,我们一开始尝试过这个,我认为它对我们没有任何作用,但我意识到这是一个不同的问题,这似乎有助于我们处理一些并发谢谢。
    【解决方案2】:

    测试我得到以下工作:

    1. 如果您的函数使用消耗计划,请在应用程序设置中将 WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT 设置为 1。
    2. [Microsoft.Azure.WebJobs.Singleton(Mode = SingletonMode.Function)]

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

    【讨论】:

      猜你喜欢
      • 2017-11-29
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多