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
.
定义的值
使用消费计划。我创建了一个服务总线 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
.