Compartilhar via


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.

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