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.

Funções baseadas em eventos sem servidor que trabalham com o gatilho do Azure Functions para o Azure Cosmos DB e compartilham um contêiner de concessõ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.