Замените Container.CreateItemAsyn c на Container.CreateTransactionalBatch. - PullRequest
0 голосов
/ 06 августа 2020

Я хочу использовать Container.CreateTransactionlBatch для операции массовой вставки. В настоящее время я делаю это с помощью метода container.CreateItemAsyn c, который требует больше времени.

Можно ли заменить container.CreateItemAsyn c на Container.CreateTransactionalBatch?

private async Task AddSubscription(EnableOrDisableSubscriptionCommand command, SubscriptionAction subscriptionAction, IList<int> notificationCategoryTypes)
        {
            List<Task> bulkOperations = new List<Task>();
            foreach (var notificationCategory in notificationCategoryTypes)
            {
                var notificationTypes = Utility.GetNotificationTypes((NotificationCategoryType)notificationCategory);

                foreach (var notificationType in notificationTypes)
                {
                    foreach (var payerAccountSubscriptions in command.Subscriptions)
                    {
                        if (payerAccountSubscriptions.AccountNumbers?.Any() ?? false)
                        {
                            foreach (var accountNumber in payerAccountSubscriptions.AccountNumbers.Where(a => !string.IsNullOrEmpty(a)))
                            {
                                bulkOperations.Add(_repository.Create(subscriptionAction, notificationType,
                                      payerAccountSubscriptions.ColCoId, payerAccountSubscriptions.PayerNumber, accountNumber, command.UserRole,
                                      command.UserId));
                            }
                        }
                        else
                        {
                            bulkOperations.Add(_repository.Create(subscriptionAction, notificationType,
                                payerAccountSubscriptions.ColCoId, payerAccountSubscriptions.PayerNumber, null, command.UserRole,
                                command.UserId));

                        }
                    }
                }
            }
            await Task.WhenAll(bulkOperations);
        }

 public async Task<ItemResponse<Subscription>> Create(SubscriptionAction subscriptionAction, NotificationType notificationType,
            int colCoId, string payerNumber, string accountNumber, UserRole userRole, string userId, string cardId = null)
        {
            var eventType = Utility.GetEventType(notificationType);

            var subscriptionBase = new Subscription
            {
                Id = Guid.NewGuid(),
                IsActive = true,
                Action = subscriptionAction,
                ActionDesc = subscriptionAction.ToString(),
                Version = (int)SubscriptionVersion.V2,
                NotificationType = notificationType,
                NotificationTypeDesc = notificationType.ToString(),
                EventType = eventType,
                EventTypeDesc = eventType.ToString(),
                ColCoId = colCoId,
                PayerNumber = payerNumber,
                AccountNumber = accountNumber,
                CardId = cardId,
                DistributionGroups = new List<string> { userRole.ToString() },
                DistributionUserIds = new List<string> { userId }
            };
            return await CreateItemAsync(subscriptionBase);
        }

public async Task<ItemResponse<T>> CreateItemAsync(T item)
        {
            return await _container.CreateItemAsync<T>(item);
        }

1 Ответ

2 голосов
/ 06 августа 2020

Есть две разные вещи.

  • TransactionalBatch предназначен для сценария ios, где у вас есть группа операций, которые вам нужно зафиксировать как одну единицу работы, либо все они будут выполнены успешно, либо все они терпят неудачу. Если одна из пакетных операций терпит неудачу, все равно терпят неудачу. Ссылка: https://devblogs.microsoft.com/cosmosdb/introducing-transactionalbatch-in-the-net-sdk/
  • Массовые операции, которые предназначены для сценария с оптимизацией пропускной способности ios (вы хотите воспользоваться предоставленной пропускной способностью и использовать ее полностью или в максимально возможной степени. в pu sh через средний или большой объем данных). Ссылка: https://devblogs.microsoft.com/cosmosdb/introducing-bulk-support-in-the-net-sdk/

Судя по коду, которым вы делитесь, похоже, что вы пытаетесь использовать Bulk? Если это так, вам необходимо убедиться, что ваш экземпляр CosmosClient создан с CosmosClientOptions, в котором включен Bulk:

CosmosClientOptions options = new CosmosClientOptions() { AllowBulkExecution = true };
CosmosClient cosmosclient = new CosmosClient(connectionString, options);

Также в вашем коде вы можете удалить await из другие методы и просто верните Task, например:

public Task<ItemResponse<Subscription>> Create(SubscriptionAction subscriptionAction, NotificationType notificationType,
    int colCoId, string payerNumber, string accountNumber, UserRole userRole, string userId, string cardId = null)
{
    // ... OTHER CODE
    return CreateItemAsync(subscriptionBase);
}

public Task<ItemResponse<T>> CreateItemAsync(T item)
{
    return _container.CreateItemAsync<T>(item);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...