Создание нескольких триггеров Функции Azure для Azure Cosmos DB
ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL
В этой статье описывается, как настроить несколько триггеров Функции 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 может потребоваться увеличить подготовленную пропускную способность.
Следующие шаги
- См. полную конфигурацию триггера Функции Azure для Azure Cosmos DB.
- Ознакомьтесь с расширенным списком примеров для всех языков.
- Изучите другие примеры сценариев бессерверных вычислений с Функциями Azure и Azure Cosmos DB в репозитории GitHub.