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


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

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