Предположим, у нас есть следующий сценарий:
- Очередь служебной шины с 10 000 сообщений
- Azure Функции (в плане потребления) с функцией, настроенной в качестве триггера для SB Очередь
- Внешняя (вне нашего контроля) система, которая не может пройти определенную частоту запросов
Если я ставлю эти 10k сообщений в очередь так быстро, как могу, внешняя система не в состоянии справиться с параллельной нагрузкой. Я не знаю, сколько экземпляров функций или экземпляров службы приложений (" scale out ") 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);
}
}
Я не могу обработать все 10 тыс. сообщений с помощью одной функции, потому что внешний вызов службы занимает несколько секунд (5-10 с) и обрабатывает все из этих сообщений с одним вызовом функции превысит максимум 10 минут для вызовов функций.
Как я могу ограничить количество одновременных функций, которые используют сообщения из моей очереди?