Поделиться через


Создание нескольких триггеров Azure Functions для Azure Cosmos DB

ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL

В этой статье описывается, как настроить несколько триггеров Функции Azure для Azure Cosmos DB для параллельной работы и независимо реагировать на изменения.

Бессерверные функции на основе событий, работающие с триггером Azure Functions для Azure Cosmos DB и использующие общий контейнер для аренды

Требования к архитектуре на основе событий

Если вы создаете бессерверные архитектуры с помощью решения Функции Azure, мы рекомендуем создавать небольшие наборы функций, которые работают совместно (а не крупные длительные функции).

** При создании бессерверных потоков на основе событий с помощью триггера Функции Azure для Azure Cosmos DB вы столкнетесь со сценарием, в котором хотите выполнить несколько действий, когда в определенном контейнере Azure Cosmos DB возникает новое событие. Если действия, которые вы хотите активировать, не зависят друг от друга, идеальным решением будет создание одного триггера Azure Functions для Azure Cosmos DB для каждого действия, которое вы хотите выполнить, и все они прослушивают изменения в одном контейнере Azure Cosmos DB.

Оптимизация контейнеров для нескольких триггеров

Учитывая требования триггера функций Azure для Azure Cosmos DB, нам нужен второй контейнер для хранения состояния, который также называется контейнером арендных записей. Означает ли это, что для каждой функции Azure требуется отдельный контейнер аренды?

В этом случае существует два подхода.

  • Создайте один контейнер аренды на функцию. Такой подход может привести к дополнительным затратам, если вы не используете базу данных с общей пропускной способностью. Помните, что минимальная пропускная способность на уровне контейнера составляет 400 единиц запросов, а в случае контейнера для аренд он используется только для установки контрольных точек выполнения и поддержания состояния.
  • Создайте один контейнер аренды и предоставьте общий доступ к нему для всех функций. При таком подходе подготовленные для контейнера единицы запроса будут использоваться более эффективно, так как это позволяет нескольким функциям Azure совместно использовать одну подготовленную пропускную способность.

В этой статье подробно описывается реализация второго подхода.

Настройка общего контейнера аренды

Чтобы настроить контейнер общих аренд, единственная дополнительная конфигурация, необходимая для триггеров, — добавить LeaseContainerPrefixатрибут , если вы используете C# или leaseContainerPrefixатрибут , если вы используете JavaScript. Значением атрибута должен быть логический дескриптор, описывающий, что собой представляет определенный триггер.

Например, у вас есть три триггера: один отправляет сообщения электронной почты, другой использует статистическую обработку для создания материализованного представления, а третий отправляет изменения в другое хранилище для последующего анализа. Вы можете назначить атрибуту LeaseContainerPrefix значение emails для первого триггера, значение materialized для второго триггера, и значение analytics для третьего.

Важно то, что все три триггера могут использовать одну и ту же конфигурацию контейнера аренды (имя учетной записи, базы данных и контейнера).

Простой пример кода с использованием атрибута LeaseContainerPrefix на C# будет выглядеть так:

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)
{
    ...
}

Для JavaScript вы можете применить конфигурацию с атрибутом function.json к файлу 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"
}

Примечание.

Всегда отслеживайте использование единиц запросов, выделенных в вашем совместно используемом контейнере аренды. Каждый триггер, который разделяет его, увеличит среднее потребление пропускной способности, поэтому по мере увеличения числа функций Azure, которые его используют, может потребоваться соответственно увеличить подготовленную пропускную способность.

Следующие шаги