假设我们有以下场景:
- 包含 10,000 条消息的服务总线队列
- Azure Functions(使用计划),其中函数设置为 SB 队列的触发器
- 外部(不受我们控制)系统无法超过特定请求率
如果我尽快对这 10k 消息进行排队,外部系统将无法处理并发负载。我不知道 Azure 同时运行多少个函数实例或应用服务实例(“横向扩展”)来处理这些消息。
这是我的函数定义的代码示例:
public class MyQueueProcessor
{
private IMyDependency MyDependency { get; }
public MyQueueProcessor(IMyDependency myDependency)
{
MyDependency = myDependency;
}
[FunctionName(nameof(MyQueueProcessor))]
public async Task Run([ServiceBusTrigger("my-queue-name", Connection = "MyQueueConnection")] string item, ILogger log)
{
var req = JsonConvert.DeserializeObject<MyQueueRequest>(item);
log.LogInformation($"Beginning processing of " + req);
// Valudate req
// Call external service REST API
await MyDependency.CallService(req, new { otherParameters = true });
log.LogInformation($"Finished processing of " + req);
}
}
我无法使用单个函数处理所有 10k 消息,因为外部服务调用需要数秒才能完成(5-10 秒),并且使用一个函数调用处理所有这些消息将超过 10 分钟的最大值函数调用。
如何限制正在运行的消耗队列中消息的并发函数的数量?
最佳答案
您现在可以通过 Azure 门户中“横向扩展”菜单下的“强制横向扩展限制”来限制实例数量在您的 Azure Function 应用程序上。 关闭后,消耗计划的限制将默认为 200 个实例。
请注意,当您使用服务总线绑定(bind)时,每个实例还可以同时接收和处理消息。您可以通过在 host.json
中设置 maxConcurrentCalls
来限制这一点。默认值为 16。
{
"version": "2.0",
"extensions": {
"serviceBus": {
"messageHandlerOptions": {
"autoComplete": true,
"maxAutoRenewDuration": "00:05:00",
"maxConcurrentCalls": 16
}
}
}
}
并发处理的最大消息数将为实例数乘以 maxConcurrentCalls
。
关于c# - 限制服务总线消息接收的 Azure Functions 速率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61231796/