Tworzenie wielu wyzwalaczy usługi Azure Functions dla usługi Azure Cosmos DB
DOTYCZY: NoSQL
W tym artykule opisano, jak można skonfigurować wiele wyzwalaczy usługi Azure Functions, aby usługa Azure Cosmos DB działała równolegle i niezależnie reagować na zmiany.
Wymagania dotyczące architektury opartej na zdarzeniach
Podczas tworzenia architektur bezserwerowych za pomocą usługi Azure Functions zaleca się tworzenie małych zestawów funkcji, które współpracują ze sobą zamiast dużych długotrwałych funkcji.
Podczas tworzenia przepływów bezserwerowych opartych na zdarzeniach przy użyciu wyzwalacza usługi Azure Functions dla usługi Azure Cosmos DB nastąpi przejście do scenariusza, w którym chcesz wykonać wiele czynności przy każdym wystąpieniu nowego zdarzenia w konkretnym kontenerze usługi Azure Cosmos DB. Jeśli akcje, które chcesz wyzwolić, są niezależne od siebie, idealnym rozwiązaniem byłoby utworzenie jednego wyzwalacza usługi Azure Functions dla usługi Azure Cosmos DB na akcję , którą chcesz wykonać, wszystkie nasłuchiwanie zmian w tym samym kontenerze usługi Azure Cosmos DB.
Optymalizowanie kontenerów dla wielu wyzwalaczy
Biorąc pod uwagę wymagania wyzwalacza usługi Azure Functions dla usługi Azure Cosmos DB, potrzebujemy drugiego kontenera do przechowywania stanu, nazywanego również kontenerem dzierżaw. Czy oznacza to, że potrzebujesz oddzielnego kontenera dzierżaw dla każdej funkcji platformy Azure?
W tym miejscu dostępne są dwie opcje:
- Utwórz jeden kontener dzierżaw na funkcję: takie podejście może przełożyć się na dodatkowe koszty, chyba że używasz bazy danych z udostępnioną przepływnością. Należy pamiętać, że minimalna przepływność na poziomie kontenera to 400 jednostek żądań, a w przypadku kontenera dzierżaw jest używana tylko do sprawdzania postępu i konserwacji stanu.
- Mieć jeden kontener dzierżawy i udostępnić go dla wszystkich funkcji: ta druga opcja zapewnia lepsze wykorzystanie aprowizowania jednostek żądań w kontenerze, ponieważ umożliwia wielu usłudze Azure Functions współużytkowanie i używanie tej samej aprowizowanej przepływności.
Celem tego artykułu jest przeprowadzenie drugiej opcji.
Konfigurowanie kontenera dzierżaw udostępnionych
Aby skonfigurować kontener dzierżaw udostępnionych, jedyną dodatkową konfiguracją, którą należy wykonać na wyzwalaczach, jest dodanie atrybutu LeaseContainerPrefix
, jeśli używasz języka C# lub leaseContainerPrefix
atrybutu, jeśli używasz języka JavaScript. Wartość atrybutu powinna być logicznym deskryptorem tego konkretnego wyzwalacza.
Jeśli na przykład masz trzy wyzwalacze: jeden, który wysyła wiadomości e-mail, jeden, który wykonuje agregację w celu utworzenia zmaterializowanego widoku, i taki, który wysyła zmiany do innego magazynu, na potrzeby późniejszej analizy, można przypisać LeaseContainerPrefix
"wiadomości e-mail" do pierwszego, "zmaterializowane" do drugiego i "analizy" do trzeciego.
Ważną częścią jest to, że wszystkie trzy wyzwalacze mogą używać tej samej konfiguracji kontenera dzierżaw (konta, bazy danych i nazwy kontenera).
Bardzo proste przykłady kodu używające atrybutu LeaseContainerPrefix
w języku C#wyglądają następująco:
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using System.Collections.Generic;
using Microsoft.Extensions.Logging;
[FunctionName("SendEmails")]
public static void SendEmails([CosmosDBTrigger(
databaseName: "ToDoItems",
containerName: "Items",
Connection = "CosmosDBConnection",
LeaseContainerName = "leases",
LeaseContainerPrefix = "emails")]IReadOnlyList<MyItem> items,
ILogger log)
{
...
}
[FunctionName("MaterializedViews")]
public static void MaterializedViews([CosmosDBTrigger(
databaseName: "ToDoItems",
containerName: "Items",
Connection = "CosmosDBConnection",
LeaseContainerName = "leases",
LeaseContainerPrefix = "materialized")]IReadOnlyList<MyItem> items,
ILogger log)
{
...
}
W przypadku języka JavaScript można zastosować konfigurację pliku function.json
za pomocą atrybutu leaseContainerPrefix
:
{
"type": "cosmosDBTrigger",
"name": "documents",
"direction": "in",
"leaseContainerName": "leases",
"connection": "CosmosDBConnection",
"databaseName": "ToDoItems",
"containerName": "Items",
"leaseContainerPrefix": "emails"
},
{
"type": "cosmosDBTrigger",
"name": "documents",
"direction": "in",
"leaseContainerName": "leases",
"connection": "CosmosDBConnection",
"databaseName": "ToDoItems",
"containerName": "Items",
"leaseContainerPrefix": "materialized"
}
Uwaga
Zawsze monitoruj jednostki żądań aprowizowania w kontenerze dzierżaw udostępnionych. Każdy wyzwalacz, który go udostępnia, zwiększy średnie zużycie przepływności, więc może być konieczne zwiększenie aprowizowanej przepływności w miarę zwiększania liczby używanych funkcji platformy Azure.
Następne kroki
- Zobacz pełną konfigurację wyzwalacza usługi Azure Functions dla usługi Azure Cosmos DB
- Sprawdź rozszerzoną listę przykładów dla wszystkich języków.
- Aby uzyskać więcej przykładów, odwiedź stronę Przepisy bezserwerowe w usłudze Azure Cosmos DB i repozytorium GitHub usługi Azure Functions.