Azure Functions ServiceBus 触发扩展行为

Mar*_* S. 5 azure azureservicebus azure-functions

我们目前正在 Azure Function App 上运行负载测试,但吞吐量未达到我们的预期。

函数应用程序中有多种函数,但流量最多的函数是具有事件中心触发器的函数和具有使用来自启用会话的队列的消息的服务总线触发器的函数。

当系统处于负载状态时,会话启用队列中的消息将在队列中等待最多 10 分钟,直到由消费函数处理。

我知道 host.json 中有一些设置可以调整此行为,但它与我们的预期仍然相去甚远。

这是我们的host.json

{
  "version": "2.0",
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "excludedTypes": "Request"
      }
    }
  },
  "extensions": {
    "serviceBus": {
      "prefetchCount": 100,
      "sessionHandlerOptions": {
        "autoComplete": true,
        "messageWaitTimeout": "00:00:30",
        "maxAutoRenewDuration": "00:55:00",
        "maxConcurrentSessions": 200
      },
      "batchOptions": {
        "maxMessageCount": 1000,
        "operationTimeout": "00:01:00",
        "autoComplete": true
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,我希望 Function App 能够同时处理最多 200 个会话,但事实上,尽管 Function Runtime 提供了大量实例,但大多数实例似乎都闲置在那里。所以对我来说,似乎还有另一个设置限制了功能应用程序的吞吐量。

应用程序洞察监控

我知道如果我们将函数拆分为单独的函数应用程序,将会提高性能,但由于两个函数的负载非常相似,我的计划是将此步骤推迟到稍后阶段,并且仍然通过单个函数应用程序获得可接受的吞吐量。

我们在 .NET Core 3.1 上使用 Azure Functions 3

  • Microsoft.Azure.Functions.Extensions 1.1.0
  • Microsoft.Azure.WebJobs.Extensions.ServiceBus 5.0.0
  • Microsoft.Azure.WebJobs.Extensions.EventHubs 5.0.0

关于 Windows 消费计划。

感谢您提供有关如何实现可接受的吞吐量的任何提示。

Mar*_* S. 3

我发现在 ServiceBus 触发函数中处理批量消息(接收 ServiceBusMessage[] 而不是单个实例)以及启用的会话会对可扩展性产生巨大的负面影响。

将其更改为单实例后,系统的行为符合预期,并且 host.json 中的 sessionHandlerOptions 受到尊重。

我想知道这是什么原因。我猜想这可能与以下情​​况有关:Azure 函数实例从服务总线租用了许多会话来进行处理,但在文档中找不到任何相关内容。