Изменение документа CosmosDb в функциях Azure запускает бесконечный цикл - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь обновить документ в функциях Azure, когда документ CosmosDB вставлен / обновлен.

Однако, когда я обновляю документ внутри функции, функция запускается снова и вызывает бесконечный цикл.

private static DocumentClient _documentClient = new DocumentClient(new Uri(serviceEndpoint), key);

[FunctionName(nameof(MyFunction))]
public static async Task RunAsync([CosmosDBTrigger(
    databaseName: "MyDatabase",
    collectionName: "MyCollection",
    ConnectionStringSetting = "MyDbConnectionString",
    LeaseCollectionName = "leases",
    CreateLeaseCollectionIfNotExists = true,
    LeaseCollectionPrefix = nameof(MyFunction))]IReadOnlyList<Document> input,
    ILogger log)
{
    var replacementsTasks = new List<Task>();

    foreach (var item in input)
    {
        item.SetPropertyValue("Updated", true);
        replacementsTasks.Add(_documentClient.ReplaceDocumentAsync(item));
    }

    await Task.WhenAll(replacementsTasks);
}

Как я могу предотвратить это?Могу ли я использовать результат выхода CosmosDB с измененным документом из триггера?

Обновление 1

Я не хочу использовать другую коллекцию.Это удвоит цены на CosmosDB.Я попробовал следующее с входом и выходом CosmosDB.Однако я получаю тот же результат.Бесконечный цикл.

[FunctionName(nameof(DownloadImages))]
public static void Run(
    [CosmosDBTrigger(
    databaseName: database,
    collectionName: collection,
    ConnectionStringSetting = connectionStringName,
    LeaseCollectionName = "leases",
    CreateLeaseCollectionIfNotExists = true,
    LeaseCollectionPrefix = nameof(MyFunction))]IReadOnlyList<Document> input,
    [CosmosDB(database, collection, Id = "id", ConnectionStringSetting = connectionStringName)] out dynamic document,
    ILogger log)
{

    if(input.Count != 1) throw new ArgumentException();

    document = input.Single();
    document.myValue = true;
}

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

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

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

Одна вещь, которую вы могли бы сделать, это отфильтровать уже обновленные:

private static DocumentClient _documentClient = new DocumentClient(new Uri(serviceEndpoint), key);

[FunctionName(nameof(MyFunction))]
public static async Task RunAsync([CosmosDBTrigger(
    databaseName: "MyDatabase",
    collectionName: "MyCollection",
    ConnectionStringSetting = "MyDbConnectionString",
    LeaseCollectionName = "leases",
    CreateLeaseCollectionIfNotExists = true,
    LeaseCollectionPrefix = nameof(MyFunction))]IReadOnlyList<Document> input,
    ILogger log)
{
    var replacementsTasks = new List<Task>();

    foreach (var item in input)
    {
        if (!item.GetPropertyValue<bool>("Updated")) {
            item.SetPropertyValue("Updated", true);
            replacementsTasks.Add(_documentClient.ReplaceDocumentAsync(item));
        }
    }

    await Task.WhenAll(replacementsTasks);
}
0 голосов
/ 04 марта 2019

Предлагается способ сделать это, упомянутый в следующей документации https://docs.microsoft.com/en-us/azure/cosmos-db/serverless-computing-database

Триггер Azure Cosmos DB можно использовать с выходной привязкой к другому контейнеру Azure Cosmos DB.После того, как функция выполняет действие с элементом в фиде изменений, вы можете записать его в другой контейнер (запись в тот же контейнер, из которого она поступила, фактически создаст рекурсивный цикл).Или вы можете использовать триггер Azure Cosmos DB для эффективной миграции всех измененных элементов из одного контейнера в другой контейнер с использованием выходной привязки.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...