Criar vários gatilhos do Azure Functions para o Azure Cosmos DB
APLICA-SE A: NoSQL
Este artigo descreve como você pode configurar vários gatilhos do Azure Functions para o Azure Cosmos DB, de modo que eles funcionem em paralelo e respondam de modo independente às alterações.
Requisitos de arquitetura baseada em evento
Ao criar arquiteturas sem servidor com o Azure Functions, é recomendado criar pequenos conjuntos de função que funcionam juntos, em vez de funções grandes de execução prolongada.
Conforme você criar fluxos sem servidor baseados em eventos usando o gatilho do Azure Functions para o Azure Cosmos DB, executará o cenário em que deseja executar várias ações sempre que houver um novo evento em um contêiner do Azure Cosmos DB em particular. Se as ações que você deseja disparar são independentes umas das outras, a solução ideal é criar um gatilho do Azure Functions para o Azure Cosmos DB por ação que você deseja executar, todos escutando as alterações no mesmo contêiner do Azure Cosmos DB.
Otimizando contêineres para vários gatilhos
Considerando os requisitos do gatilho do Azure Functions para o Azure Cosmos DB, precisamos de um segundo contêiner para armazenar o estado, também chamado de contêiner de concessões. Isso significa que você precisa de um contêiner de concessões separado para cada Azure Function?
Aqui você tem duas opções:
- Criar um contêiner de concessões por Função: essa abordagem poderá se converter em custos adicionais, a menos que você esteja usando um banco de dados de taxa de transferência compartilhado. A taxa de transferência mínima no nível do contêiner é de 400 unidades de solicitação e, no caso do contêiner de concessões, só está sendo usada como ponto de verificação do progresso e para manter o estado.
- Tenha um contêiner de concessão e compartilhe-o com todas as Funções: essa segunda opção oferece um uso melhor das Unidades de Solicitação provisionadas no contêiner, pois permite que várias Azure Functions compartilhem e usem a mesma taxa de transferência provisionada.
A meta deste artigo é orientá-lo para realizar a segunda opção.
Configurando um contêiner de concessões compartilhado
Para configurar o contêiner de concessões compartilhado, a única configuração adicional que você precisa fazer a seus gatilhos é adicionar o LeaseContainerPrefix
atributo se você está usando C# ou o leaseContainerPrefix
atributo se você está usando JavaScript. O valor do atributo deve ser um descritor lógico daquele gatilho específico.
Por exemplo, se você tem três gatilhos: um que envia emails, um que faz uma agregação para criar uma exibição materializada e um que envia as alterações para outro armazenamento, para análise posterior, pode atribuir o LeaseContainerPrefix
de "emails" ao primeiro, "materializada" ao segundo e "análise" ao terceiro.
A parte importante é que todos os três Gatilhos podem usar a mesma configuração de contêiner de concessões (nome de contêiner, banco de dados e conta).
Um exemplo de código muito simples usando o atributo LeaseContainerPrefix
em C# teria esta aparência:
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)
{
...
}
Para JavaScript, você pode aplicar a configuração no arquivo function.json
com o atributo 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"
}
Observação
Sempre monitore das unidades de solicitação provisionadas em seu contêiner de concessões compartilhado. Cada Gatilho que o compartilha aumentará o consumo médio de taxa de transferência, portanto, talvez seja necessário aumentar a produtividade provisionada conforme você aumenta o número de Azure Functions que o utilizam.
Próximas etapas
- Confira a configuração completa para o gatilho do Azure Functions para o Azure Cosmos DB
- Verifique a lista de exemplos estendida para todos os idiomas.
- Visite as receitas Sem Servidor com o repositório do GitHub do Azure Cosmos DB e do Azure Functions para obter mais exemplos.