Microsoft Azure 函数 (nodejs)、WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT 和 maxConcurrentCalls 没有按他们说的做

Microsoft Azure functions (nodejs), WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT and maxConcurrentCalls not doing what they say

使用消费计划。我创建了一个服务总线 nodejs 函数触发器应用程序。

我不使用会话。测试了两个主题 - 分区 enabled/disabled.

const timeout = ms => new Promise(res => setTimeout(res, ms))

module.exports = async function(context, mySbMsg) {
    context.log('message start:', mySbMsg);
    await timeout(60000)
    context.log('message done:', mySbMsg);
};

host.json:

{
  "version": "2.0",
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[3.3.0, 4.0.0)"
  },
  "extensions": {
    "serviceBus": {
      "prefetchCount": 1,
      "messageHandlerOptions": {
        "autoComplete": true,
        "maxConcurrentCalls": 5,
        "maxAutoRenewDuration": "00:09:30"
      }
    }
  },
  "functionTimeout": "00:09:55"
}

WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT = 1

我希望每个 VM 运行 有 5 个 requests/minute。

发送 100 条消息,我希望看到 5 条messages/minute。

我确实在实时指标中看到 1 个虚拟机 运行。但是,我在日志中每分钟看到一条消息。

是的@Teebu,“prefetchCount”:1 是罪魁祸首。


示例:

如果prefetchCount设置为200,maxConcurrentCalls设置为16(假设),则200条消息将预取到特定实例,但一次只处理16条消息。

预取消息可以由 MessageSender 获取,而 MaxConcurrency 仅由客户端代码处理。


MaxConcurrentCalls - 单个 MessageReceiver 将同时处理多少条消息。

PrefetchCount - 发起调用接收消息时,单次MessageReceiver最多可以检索多少条消息。

要相同的值,设置这两个是counterproductive.

PrefetchCount 应大于并发处理的消息数.


简单来说:

Azure Functions SDK 使用的底层 MessageReceiver 预取的最大消息数由 prefetchCount.

决定

为确保在等待处理时不会预取太多消息和丢失锁,请确保 prefetchCount 已正确配置为 maxConcurrentCalls.

定义的值