【发布时间】: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 分钟的最大值函数调用。
如何限制正在运行的同时使用队列中消息的函数的数量?
【问题讨论】:
-
我可以看到 v1 host.json 的一些设置来控制并发请求docs.microsoft.com/en-us/azure/azure-functions/…(v2 看不到)
标签: c# azure azure-functions message-queue azureservicebus