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


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

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

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

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

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

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

При создании бессерверных потоков на основе событий с помощью триггера Функции Azure для Azure Cosmos DB вы будете столкнуться со сценарием, в котором требуется выполнить несколько действий при возникновении нового события в определенном контейнере Azure Cosmos DB. Если действия, которые вы хотите активировать, не зависят друг от друга, идеальным решением было бы создать один триггер Функции Azure для 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 вы можете применить конфигурацию с атрибутом leaseContainerPrefix к файлу function.json:

{
    "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 может потребоваться увеличить подготовленную пропускную способность.

Дальнейшие действия