Skalowanie na podstawie celu
Skalowanie oparte na obiekcie docelowym zapewnia szybki i intuicyjny model skalowania dla klientów i jest obecnie obsługiwany w przypadku tych rozszerzeń powiązań:
- Apache Kafka
- Azure Cosmos DB
- Azure Event Hubs
- Azure Queue Storage
- Azure Service Bus (kolejka i tematy)
Skalowanie na podstawie celu zastępuje poprzedni model skalowania przyrostowego usługi Azure Functions jako domyślny dla tych typów rozszerzeń. Skalowanie przyrostowe dodano lub usunięto maksymalnie jeden proces roboczy z każdą nową szybkością wystąpień ze złożonymi decyzjami dotyczącymi tego, kiedy przeprowadzić skalowanie. Natomiast skalowanie na podstawie celu umożliwia skalowanie w górę czterech wystąpień naraz, a decyzja o skalowaniu jest oparta na prostym równaniu opartym na obiekcie docelowym:
W tym równaniu długość źródła zdarzeń odnosi się do liczby zdarzeń, które należy przetworzyć. Domyślne wykonania docelowe na wartości wystąpienia pochodzą z zestawów SDK używanych przez rozszerzenia usługi Azure Functions. Nie musisz wprowadzać żadnych zmian w celu skalowania na podstawie celu.
Kwestie wymagające rozważenia
Podczas korzystania ze skalowania na podstawie celu należy wziąć pod uwagę następujące kwestie:
- Skalowanie na podstawie celu jest domyślnie włączone dla aplikacji funkcji w planie Zużycie, planie Flex Consumption i planach Elastic Premium. Skalowanie sterowane zdarzeniami nie jest obsługiwane w przypadku uruchamiania w planach dedykowanych (App Service).
- Skalowanie oparte na elementach docelowych jest domyślnie włączone od wersji 4.19.0 środowiska uruchomieniowego usługi Functions.
- W przypadku korzystania ze skalowania opartego na obiekcie docelowym limity skalowania są nadal uznawane. Aby uzyskać więcej informacji, zobacz Ograniczanie skalowania w poziomie.
- Aby osiągnąć najbardziej dokładne skalowanie na podstawie metryk, użyj tylko jednej funkcji wyzwalanej na podstawie celu dla aplikacji funkcji. Należy również rozważyć uruchomienie planu Flex Consumption, który oferuje skalowanie poszczególnych funkcji.
- Gdy wiele funkcji w tej samej aplikacji funkcji żąda skalowania w poziomie w tym samym czasie, suma w tych funkcjach jest używana do określenia zmiany w żądanych wystąpieniach. Funkcje żądające skalowania w poziomie zastępują funkcje żądające skalowania w poziomie.
- Jeśli istnieją żądania skalowane w poziomie bez żadnych żądań skalowania w poziomie, jest używana maksymalna skala w wartości.
Rezygnacja
Skalowanie na podstawie celu jest domyślnie włączone dla aplikacji funkcji hostowanych w planie Zużycie lub w planach Premium. Aby wyłączyć skalowanie na podstawie celu i powrócić do skalowania przyrostowego, dodaj następujące ustawienie aplikacji do aplikacji funkcji:
Ustawienia aplikacji | Wartość |
---|---|
TARGET_BASED_SCALING_ENABLED |
0 |
Dostosowywanie skalowania opartego na obiekcie docelowym
Zachowanie skalowania może być bardziej lub mniej agresywne w oparciu o obciążenie aplikacji, dostosowując docelowe wykonania na wystąpienie. Każde rozszerzenie ma różne ustawienia, których można użyć do ustawiania docelowych wykonań na wystąpienie.
W tej tabeli przedstawiono podsumowanie host.json
wartości używanych do wykonywania docelowego dla wartości wystąpienia i wartości domyślnych:
Numer wewnętrzny | host.json wartości | Wartość domyślna |
---|---|---|
Event Hubs (rozszerzenie w wersji 5.x+) | extensions.eventHubs.maxEventBatchSize | 100* |
Event Hubs (rozszerzenie w wersji 3.x+) | extensions.eventHubs.eventProcessorOptions.maxBatchSize | 10 |
Event Hubs (jeśli zdefiniowano) | extensions.eventHubs.targetUnprocessedEventThreshold | nie dotyczy |
Service Bus (rozszerzenie w wersji 5.x+, pojedyncza wysyłka) | extensions.serviceBus.maxConcurrentCalls | 16 |
Service Bus (rozszerzenie w wersji 5.x+, oparta na sesjach pojedynczej wysyłki) | extensions.serviceBus.maxConcurrentSessions | 8 |
Service Bus (rozszerzenie w wersji 5.x+, przetwarzanie wsadowe) | extensions.serviceBus.maxMessageBatchSize | 1000 |
Service Bus (Functions v2.x+, Single Dispatch) | extensions.serviceBus.messageHandlerOptions.maxConcurrentCalls | 16 |
Service Bus (funkcje w wersji 2.x+, oparte na sesjach pojedynczej wysyłki) | extensions.serviceBus.sessionHandlerOptions.maxConcurrentSessions | 2000 |
Service Bus (Funkcje w wersji 2.x+, Przetwarzanie wsadowe) | extensions.serviceBus.batchOptions.maxMessageCount | 1000 |
Kolejka magazynu | extensions.queues.batchSize | 16 |
* Wartość domyślna maxEventBatchSize
została zmieniona w wersji 6.0.0 Microsoft.Azure.WebJobs.Extensions.EventHubs
pakietu. We wcześniejszych wersjach ta wartość wynosiła 10.
W przypadku niektórych rozszerzeń powiązań docelowe wykonania na wystąpienie są ustawiane przy użyciu atrybutu funkcji:
Numer wewnętrzny | Ustawienie wyzwalacza funkcji | Wartość domyślna |
---|---|---|
Apache Kafka | lagThreshold |
1000 |
Azure Cosmos DB | maxItemsPerInvocation |
100 |
Aby dowiedzieć się więcej, zobacz przykładowe konfiguracje obsługiwanych rozszerzeń.
Plan Premium z włączonym monitorowaniem skalowania w czasie wykonywania
Po włączeniu monitorowania skalowania w czasie wykonywania rozszerzenia obsługują skalowanie dynamiczne. Dzieje się tak, ponieważ kontroler skalowania nie ma dostępu do usług zabezpieczonych przez sieć wirtualną. Po włączeniu monitorowania skalowania w czasie wykonywania należy uaktualnić pakiety rozszerzeń do tych minimalnych wersji, aby odblokować dodatkową funkcję skalowania na podstawie celu:
Nazwa rozszerzenia | Wymagana minimalna wersja |
---|---|
Apache Kafka | 3.9.0 |
Azure Cosmos DB | 4.1.0 |
Event Hubs | 5.2.0 |
Service Bus | 5.9.0 |
Kolejka magazynu | 5.1.0 |
Obsługa dynamicznej współbieżności
Skalowanie oparte na obiekcie docelowym wprowadza szybsze skalowanie i używa wartości domyślnych dla wykonań docelowych na wystąpienie. W przypadku korzystania z usługi Service Bus, kolejek magazynu lub platformy Kafka można również włączyć współbieżność dynamiczną. W tej konfiguracji docelowe wykonania na wartość wystąpienia są określane automatycznie przez funkcję współbieżności dynamicznej. Zaczyna się od ograniczonej współbieżności i identyfikuje najlepsze ustawienie w czasie.
Obsługiwane rozszerzenia
Sposób konfigurowania skalowania na podstawie celu w pliku host.json zależy od określonego typu rozszerzenia. Ta sekcja zawiera szczegółowe informacje o konfiguracji rozszerzeń, które obecnie obsługują skalowanie na podstawie celu.
Kolejki i tematy usługi Service Bus
Rozszerzenie usługi Service Bus obsługuje trzy modele wykonywania określone przez IsBatched
atrybuty i IsSessionsEnabled
wyzwalacza usługi Service Bus. Wartość domyślna dla IsBatched
elementu i IsSessionsEnabled
to false
.
Model wykonywania | IsBatched | IsSessionsEnabled | Ustawienie używane do wykonywania docelowych na wystąpienie |
---|---|---|---|
Przetwarzanie pojedynczej wysyłki | fałsz | fałsz | maxConcurrentCalls |
Przetwarzanie pojedynczej wysyłki (oparte na sesji) | fałsz | prawda | maxConcurrentSessions |
Przetwarzanie wsadowe | prawda | fałsz | maxMessageBatchSize lub maxMessageCount |
Uwaga
Wydajność skalowania: w przypadku rozszerzenia usługi Service Bus użyj opcji Zarządzaj prawami do zasobów w celu uzyskania najbardziej wydajnego skalowania. W przypadku skalowania praw nasłuchiwania przywraca się do skalowania przyrostowego, ponieważ długość kolejki lub tematu nie może służyć do informowania o decyzjach dotyczących skalowania. Aby dowiedzieć się więcej na temat ustawiania praw w zasadach dostępu usługi Service Bus, zobacz Zasady autoryzacji dostępu współdzielonego.
Przetwarzanie pojedynczej wysyłki
W tym modelu każde wywołanie funkcji przetwarza jeden komunikat. Ustawienie maxConcurrentCalls
określa docelowe wykonania na wystąpienie. Określone ustawienie zależy od wersji rozszerzenia usługi Service Bus.
Zmodyfikuj host.json
ustawienie maxConcurrentCalls
, jak w poniższym przykładzie:
{
"version": "2.0",
"extensions": {
"serviceBus": {
"maxConcurrentCalls": 16
}
}
}
Przetwarzanie pojedynczej wysyłki (oparte na sesji)
W tym modelu każde wywołanie funkcji przetwarza jeden komunikat. Jednak w zależności od liczby aktywnych sesji dla tematu lub kolejki usługi Service Bus każde wystąpienie dzierżawi co najmniej jedną sesję. Określone ustawienie zależy od wersji rozszerzenia usługi Service Bus.
Zmodyfikuj ustawienie maxConcurrentSessions
, host.json
aby ustawić docelowe wykonania na wystąpienie, jak w poniższym przykładzie:
{
"version": "2.0",
"extensions": {
"serviceBus": {
"maxConcurrentSessions": 8
}
}
}
Przetwarzanie wsadowe
W tym modelu każde wywołanie funkcji przetwarza partię komunikatów. Określone ustawienie zależy od wersji rozszerzenia usługi Service Bus.
Zmodyfikuj ustawienie maxMessageBatchSize
, host.json
aby ustawić docelowe wykonania na wystąpienie, jak w poniższym przykładzie:
{
"version": "2.0",
"extensions": {
"serviceBus": {
"maxMessageBatchSize": 1000
}
}
}
Event Hubs
W przypadku usługi Azure Event Hubs usługa Azure Functions jest skalowana na podstawie liczby nieprzetworzonych zdarzeń rozproszonych we wszystkich partycjach w centrum zdarzeń. Domyślnie host.json
atrybuty używane do wykonywania obiektów docelowych na wystąpienie to maxEventBatchSize
i maxBatchSize
. Jeśli jednak zdecydujesz się dostosować skalowanie oparte na obiekcie docelowym, możesz zdefiniować oddzielny parametr targetUnprocessedEventThreshold
, który zastępuje ustawianie docelowych wykonań na wystąpienie bez zmieniania ustawień wsadowych. Jeśli targetUnprocessedEventThreshold
jest ustawiona, łączna liczba nieprzetworzonych zdarzeń jest podzielona przez tę wartość w celu określenia liczby wystąpień, która jest następnie zaokrąglona do liczby wystąpień procesu roboczego, która tworzy zrównoważoną dystrybucję partycji.
Uwaga
Ponieważ usługa Event Hubs jest obciążeniem podzielonym na partycje, liczba wystąpień docelowych dla usługi Event Hubs jest ograniczona przez liczbę partycji w centrum zdarzeń.
Określone ustawienie zależy od wersji rozszerzenia usługi Event Hubs.
Zmodyfikuj ustawienie maxEventBatchSize
, host.json
aby ustawić docelowe wykonania na wystąpienie, jak w poniższym przykładzie:
{
"version": "2.0",
"extensions": {
"eventHubs": {
"maxEventBatchSize" : 100
}
}
}
Po zdefiniowaniu w programie host.json
targetUnprocessedEventThreshold
parametr jest używany jako docelowe wykonania dla wystąpienia zamiast maxEventBatchSize
, jak w poniższym przykładzie:
{
"version": "2.0",
"extensions": {
"eventHubs": {
"targetUnprocessedEventThreshold": 153
}
}
}
Kolejki usługi Storage
W przypadku rozszerzenia Storage w wersji 2.x+ zmodyfikuj host.json
ustawienie batchSize
, aby ustawić docelowe wykonania na wystąpienie:
{
"version": "2.0",
"extensions": {
"queues": {
"batchSize": 16
}
}
}
Uwaga
Wydajność skalowania: w przypadku rozszerzenia kolejki magazynu komunikaty o widocznościTimeout są nadal liczone w długości źródła zdarzeń przez interfejsy API kolejki magazynu. Może to spowodować nadmierne skalowanie aplikacji funkcji. Rozważ użycie kolejek usługi Service Bus que zaplanowanych komunikatów, ograniczenia skalowania w poziomie lub braku widocznościTimeout dla rozwiązania.
Azure Cosmos DB
Usługa Azure Cosmos DB używa atrybutu na poziomie funkcji . MaxItemsPerInvocation
Sposób ustawiania tego atrybutu na poziomie funkcji zależy od języka funkcji.
Dla skompilowanej funkcji języka C# ustaw MaxItemsPerInvocation
w definicji wyzwalacza, jak pokazano w poniższych przykładach dla funkcji języka C# w procesie:
namespace CosmosDBSamplesV2
{
public static class CosmosTrigger
{
[FunctionName("CosmosTrigger")]
public static void Run([CosmosDBTrigger(
databaseName: "ToDoItems",
collectionName: "Items",
MaxItemsPerInvocation: 100,
ConnectionStringSetting = "CosmosDBConnection",
LeaseCollectionName = "leases",
CreateLeaseCollectionIfNotExists = true)]IReadOnlyList<Document> documents,
ILogger log)
{
if (documents != null && documents.Count > 0)
{
log.LogInformation($"Documents modified: {documents.Count}");
log.LogInformation($"First document Id: {documents[0].Id}");
}
}
}
}
Uwaga
Ponieważ usługa Azure Cosmos DB jest obciążeniem podzielonym na partycje, liczba wystąpień docelowych dla bazy danych jest ograniczona przez liczbę partycji fizycznych w kontenerze. Aby dowiedzieć się więcej na temat skalowania usługi Azure Cosmos DB, zobacz partycje fizyczne i własność dzierżawy.
Apache Kafka
Rozszerzenie Apache Kafka używa atrybutu LagThreshold
na poziomie funkcji . W przypadku platformy Kafka liczba żądanych wystąpień jest obliczana na podstawie łącznego opóźnienia konsumentów podzielonego LagThreshold
przez ustawienie. W przypadku danego opóźnienia zmniejszenie progu opóźnienia zwiększa liczbę żądanych wystąpień.
Sposób ustawiania tego atrybutu na poziomie funkcji zależy od języka funkcji. W tym przykładzie ustawiono próg na 100
wartość .
W przypadku skompilowanej funkcji języka C# ustaw LagThreshold
w definicji wyzwalacza, jak pokazano w poniższych przykładach dla funkcji języka C# w procesie dla wyzwalacza usługi Event Hubs platformy Kafka:
[FunctionName("KafkaTrigger")]
public static void Run(
[KafkaTrigger("BrokerList",
"topic",
Username = "$ConnectionString",
Password = "%EventHubConnectionString%",
Protocol = BrokerProtocol.SaslSsl,
AuthenticationMode = BrokerAuthenticationMode.Plain,
ConsumerGroup = "$Default",
LagThreshold = 100)] KafkaEventData<string> kevent, ILogger log)
{
log.LogInformation($"C# Kafka trigger function processed a message: {kevent.Value}");
}
Następne kroki
Więcej informacji można znaleźć w następujących artykułach: