c# - 限制服务总线消息接收的 Azure Functions 速率

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

假设我们有以下场景:

  • 包含 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/

相关文章:

c# - ObjectStateManager Changed 不会为修改后的实体触发?

c# - 使用 JsonConverter json.net 将 JSON 反序列化为对象列表

azure - 物联网中心中物联网边缘设备的回滚策略

c# - 如何将 local.settings.json 从 azure 函数移植到 .NET 核心 Web 项目?

azure - 从 Azure 函数将数据存储在 Google Sheets 中

c# - 如何在 Azure 中从一个 csx 文件调用函数到另一个 csx 文件?

c# - 如何在发布应用程序后更改安装文件夹 Url

c# - 形成 Load() 或不形成 Load()

azure - 是否可以通过Azure API创建开放端口的Azure VM?

azure - 使用 Azure Resource Graph 的公共(public) ip 列表以及订阅名称、Azure 中的资源类型