限制服务总线消息接收的 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 速率的主要内容,如果未能解决你的问题,请参考以下文章