限制 Azure Functions 服务总线消息接收率

qJa*_*ake 5 c# message-queue azure azureservicebus azure-functions

假设我们有以下场景:

  • 具有 10,000 条消息的服务总线队列
  • Azure Functions (on Consumption plan) 将函数设置为 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我无法使用单个函数处理所有 10k 条消息,因为外部服务调用需要几秒钟才能完成(5-10 秒),并且使用一个函数调用处理所有这些消息将超过函数调用的 10 分钟最大值。

如何限制正在运行的消耗队列中消息的并发函数的数量?

iko*_*ddn 7

现在,您可以在 Azure Function App 上的“横向扩展”菜单下的 Azure 门户中使用“强制横向扩展限制”来限制实例数量。关闭后,消耗计划的限制将默认为 200 个实例。

请注意,当您使用服务总线绑定时,每个实例还可以同时接收和处理消息。您可以通过设置来限制这maxConcurrentCalls一点host.json。默认值为 16。

{
  "version": "2.0",
  "extensions": {
    "serviceBus": {
      "messageHandlerOptions": {
        "autoComplete": true,
        "maxAutoRenewDuration": "00:05:00",
        "maxConcurrentCalls": 16
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

并发处理的最大消息数将是实例数乘以maxConcurrentCalls