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

Posted

技术标签:

【中文标题】限制服务总线消息接收的 Azure Functions 速率【英文标题】:Limiting Azure Functions Rate of Service Bus Message Intake 【发布时间】: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 分钟的最大值函数调用。

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

【问题讨论】:

也许你需要持久的函数:docs.microsoft.com/en-us/azure/azure-functions/durable/… 我可以看到 v1 host.json 的一些设置来控制并发请求docs.microsoft.com/en-us/azure/azure-functions/…(v2 看不到) 【参考方案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 函数。如果您试图限制并发/限制特定功能而不是其他功能,这将不是一个有效的解决方案。

以上是关于限制服务总线消息接收的 Azure Functions 速率的主要内容,如果未能解决你的问题,请参考以下文章

Azure 服务总线主题订阅者接收订单

Azure 服务总线:通过具有内置重试策略的消息泵接收到的瞬时错误(异常)。为啥?

在 web api 中接收服务总线消息队列/主题

Azure 服务总线队列以并行方式异步处理消息

如何删除 Azure 服务总线主题上的死信消息

Javascript/nodejs Azure 服务总线完成一条消息