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 que o Azure Cosmos DB funcione em paralelo e reaja independentemente às alterações.
Requisitos de arquitetura baseados em eventos
Ao criar arquiteturas sem servidor com o Azure Functions, é recomendável criar pequenos conjuntos de funções que trabalhem juntos em vez de grandes funções de longa execução.
Ao criar fluxos sem servidor baseados em eventos usando o gatilho do Azure Functions para o Azure Cosmos DB, você se deparará com o cenário em que deseja fazer várias coisas sempre que houver um novo evento em um contêiner específico do Azure Cosmos DB. Se as ações que você deseja acionar forem independentes umas das outras, a solução ideal seria criar um gatilho do Azure Functions para o Azure Cosmos DB por ação que você deseja fazer, todos ouvindo as alterações no mesmo contêiner do Azure Cosmos DB.
Otimizando contêineres para vários gatilhos
Dados 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 locações. Isso significa que você precisa de um contêiner de concessões separado para cada Função do Azure?
Aqui, você tem duas opções:
- Criar um contêiner de locações por função: essa abordagem pode se traduzir em custos adicionais, a menos que você esteja usando um banco de dados de taxa de transferência compartilhado. Lembre-se de que 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 locações, ele está sendo usado apenas para verificar o progresso e manter o estado.
- Tenha um contêiner de concessão e compartilhe-o para todas as suas Funções: essa segunda opção faz melhor uso das Unidades de Solicitação provisionadas no contêiner, pois permite que várias Funções do Azure compartilhem e usem a mesma taxa de transferência provisionada.
O objetivo deste artigo é guiá-lo para realizar a segunda opção.
Configurando um contêiner de concessões compartilhadas
Para configurar o contêiner de concessões compartilhadas, a única configuração extra que você precisa fazer em seus gatilhos é adicionar o LeaseContainerPrefix
atributo se estiver usando C# ou leaseContainerPrefix
atributo se estiver usando JavaScript. O valor do atributo deve ser um descritor lógico do que esse gatilho específico.
Por exemplo, se você tiver três gatilhos: um que envia e-mails, um que faz uma agregação para criar uma visualização materializada e outro que envia as alterações para outro armazenamento, para análise posterior, você pode atribuir o LeaseContainerPrefix
de "e-mails" ao primeiro, "materializado" ao segundo e "analytics" ao terceiro.
A parte importante é que todos os três Triggers podem usar a mesma configuração de contêiner de concessões (conta, banco de dados e nome do contêiner).
Um exemplo de código muito simples usando o LeaseContainerPrefix
atributo em C#, ficaria assim:
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)
{
...
}
E para JavaScript, você pode aplicar a function.json
configuração no arquivo, com o leaseContainerPrefix
atributo:
{
"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"
}
Nota
Sempre monitore as Unidades de Solicitação provisionadas em seu contêiner de locações compartilhadas. Cada Gatilho que o compartilha aumentará o consumo médio de taxa de transferência, portanto, talvez seja necessário aumentar a taxa de transferência provisionada à medida que aumenta o número de Funções do Azure que o estão usando.
Próximos passos
- Consulte a configuração completa do gatilho do Azure Functions para o Azure Cosmos DB
- Verifique a lista alargada de amostras para todos os idiomas.
- Visite as receitas sem servidor com o Azure Cosmos DB e o repositório GitHub do Azure Functions para obter mais exemplos.