【问题标题】:Limiting Azure Functions Rate of Service Bus Message Intake限制服务总线消息接收的 Azure Functions 速率
【发布时间】:2020-07-28 14:29:27
【问题描述】:

假设我们有以下场景:

  • 包含 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 分钟的最大值函数调用。

如何限制正在运行的同时使用队列中消息的函数的数量?

【问题讨论】:

标签: c# azure azure-functions message-queue azureservicebus


【解决方案1】:

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

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

{
  "version": "2.0",
  "extensions": {
    "serviceBus": {
      "messageHandlerOptions": {
        "autoComplete": true,
        "maxAutoRenewDuration": "00:05:00",
        "maxConcurrentCalls": 16
      }
    }
  }
}

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

【讨论】:

  • 请记住,这将影响应用程序中的所有 ServiceBusTriggered 函数。如果您试图限制并发/限制特定功能而不是其他功能,这将不是一个有效的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多