Устарел ли класс Document при использовании CosmosDBTrigger?

Устарел ли класс Документ в пространстве имен Microsoft.Azure.Documents при разработке изолированных функций Azure?

Недавно я перенес/обновил функцию Azure .NET6 (v4) с запущенной в процессе на внепроцессную, также известную как изолированная (изолированная от сети).

Моя функция Azure использует CosmosDBTrigger для обработки событий канала изменений.

Одним из необходимых шагов для миграции является создание ссылок на пакеты:

Основные пакеты:

The following packages are required to run your .NET functions in an isolated process:

Пакеты расширений:

Because functions that run in a .NET isolated process use different binding types, they require a unique set of binding extension packages.

Поскольку моя функция Azure использует CosmosDBTrigger, мне также нужна эта ссылка на пакет:

Я протестировал создание новой функции Azure с помощью проекта изолированного шаблона .NET6 в Visual Studio 2022, чтобы сравнить свой код с образцом кода. Никаких других ссылок на пакеты не требуется.

Теперь я не могу использовать IReadOnlyList<Document>, так как необходимо обновить следующий старый код:

[FunctionName("CosmosTrigger")]
    public static void Run([CosmosDBTrigger(
        databaseName: "ToDoItems",
        collectionName: "Items",
        ConnectionStringSetting = "CosmosDBConnection",
        LeaseCollectionName = "leases",
        CreateLeaseCollectionIfNotExists = true)]IReadOnlyList<Document> documents,
        ILogger log)
    {
        if (documents != null && documents.Count > 0)
        {
            log.LogInformation($"Documents modified: {documents.Count}");
            log.LogInformation($"First document Id: {documents[0].Id}");
        }
    }

К этому:

  public class ToDoItem
  {
      public string Id { get; set; }
      public string Description { get; set; }
  }

[Function("CosmosTrigger")]
    public static void Run([CosmosDBTrigger(
        databaseName: "databaseName",
        containerName: "containerName",
        Connection = "CosmosDBConnectionSetting",
        LeaseContainerName = "leases",
        CreateLeaseContainerIfNotExists = true)]IReadOnlyList<ToDoItem> input, ILogger log)
    {
        if (input != null && input.Count > 0)
        {
            log.LogInformation("Documents modified " + input.Count);
            log.LogInformation("First document Id " + input[0].Id);
        }
    }

Нет смысла десериализовать входящие события канала изменений в пользовательский класс POCO, такой как ToDoItem в качестве примера, большой силой класса Document была возможность десериализовать события канала изменений в различные пользовательские классы POCO в зависимости от лежащей в основе структуры JSON документа CosmosDB.

Я не уверен, как обрабатывать будущие критические изменения в моих документах CosmosDB, в настоящее время у нас есть свойство documentVersion, содержащее целочисленное значение, чтобы десериализовать события канала изменений в правильный пользовательский класс POCO.

Приведенный выше пример кода вызовет исключение во время выполнения, если десериализация JSON не соответствует структуре данных класса ToDoItem.

Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
1
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, похоже, что вы используете расширение 4.0.0-preview, имейте в виду, что это расширение предварительный просмотр, не предназначенное для производства.

Десериализация в пользовательский POCO была большой проблемой для многих клиентов. Необходимость платить за производительность при переходе из Document в бизнес-класс не была идеальной для многих людей. Имеет смысл дать людям свободу удалять двойную сериализацию из своих рабочих процессов.

Если вы хотите иметь общий класс для десериализации, вы можете следовать Руководство по переходу на V3, и хорошей заменой для Document является JObject. Или, если вы используете System.Text.Jsonкак механизм сериализации, JsonDocument.

Спасибо, использование JsonDocument может быть хорошей альтернативой. Я согласен с вами в отношении снижения производительности при двойной сериализации, но я хочу быть уверен, что смогу обрабатывать документы CosmosDB с критическими изменениями в структуре JSON, не вызывая исключений во время выполнения. Недавно я узнал о «новых» политиках повторных попыток, разработанных Microsoft с использованием атрибута ExponentialBackoffRetry. Использование бесконечных повторных попыток, возникающие во время выполнения, может быть хорошим решением, позволяющим гарантировать, что любые события канала изменений будут потеряны из-за обновленной контрольной точки аренды.

Jonas 18.03.2022 09:33

Если вы решите использовать JsonDocument, помните, что вам нужно изменить механизм сериализации на System.Text.Json, иначе по умолчанию используется Newtonsoft.Json, а JObject будет правильным типом.

Matias Quaranta 18.03.2022 17:31

Другие вопросы по теме