отменено при создании документов в cosmosdb - PullRequest
0 голосов
/ 20 февраля 2019

Мы используем cosmosdb для регистрации журналов наших приложений.Наши журналы имеют два однослойных, имеют общую информацию, а другие имеют более подробную информацию общего журнала.Мы также заносим их копию в две другие коллекции для резервного копирования.Итак, у нас полностью четыре коллекции.В нашем коде мы используем Async CreateDocumentAsync для создания этих журналов.Мы сохраняем задачу в списке и используем Task.WaitAll для выполнения всех задач.В среде разработчиков мы не видели никаких ошибок, но в процессе производства мы видим отмененные ошибки в наших представлениях о приложении при создании новых документов.Пример изображения ниже.

Error info from application insights of API

Ниже приведена структура кода, которую мы используем

Код контроллера API

public void Log(LogModel logObject)
{
    try
    {
        _context.Save(logObject);
    }
    catch(Exception ex)
    {
        _azureTelemtry.TrackTrace($"Exception occured: {ex.ToString()}");
    }
}

Метод сохранения контекста

public void Save(LogModel logObject)
{
    List<Task> saveTasks = new List<Task>();
    LogInfo logInfo = logObject.logInfo;
    LogDetails logDetails = logObject.logDetails;
    saveTasks.Add(documentClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(DatabaseId, primaryLogInfoCollectionID), logInfo));
    saveTasks.Add(documentClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(DatabaseId, archieveLogInfoCollectionID), logInfo));    
    saveTasks.Add(documentClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(DatabaseId, primaryLogDetailsCollectionID), logDetails));
    saveTasks.Add(documentClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(DatabaseId, archieveLogDetailsCollectionID), logDetails));
    Task.WaitAll(saveTasks.ToArrays());
}

Сведения об исключении

System.AggregateException: at MyApplication.Logging.Controllers.ApiController.Log (MyApplication.Logging, Version = 2.0.0.0, Culture = нейтральный, PublicKeyToken = nullMyApplication.Logging, версия = 2.0.0.0, культура = нейтральная, PublicKeyToken = null: C: \ TFS \ CA \ Logging \ Release \ Release 3.0-Исправление \ ведение журнала \ Controllers \ ApiController.csMyApplication.Logging, версия = 2.0.0.0, культура= нейтральный, PublicKeyToken = null: 57) в lambda_method (анонимно размещенная сборка DynamicMethods, версия = 0.0.0.0, культура = нейтральный, PublicKeyToken = нулевой) в Microsoft.Extensions.Internal.ObjectMethodExecutor + <> c__DisplayClass33_0.bvC0 (Microsoft).Core, версия = 2.0.2.0, культура = нейтральная, PublicKeyToken = adb9793829ddae60) в Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute (Microsoft.AspNetCore.Mvc.Core, версия = 2.0.2.0, культура = нейтральная, PublicKeyToken = adb9793829ddae60) в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker + d__12.MoveNext (Microsoft.AspNetCore.Mvc.Core, версия = 2.0.2.0, культура= нейтральный, PublicKeyToken = adb9793829ddae60) в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, версия = 4.0.0.0, культура = нейтральный, PublicKeyToken = 7cec85d7bea7798e) в System.Runtime.SouserSuccessSk.Private.CoreLib, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = 7cec85d7bea7798e) в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker + d__10.MoveNext (Microsoft.AspNetCore.Mvc.Core, версия = 2.0.2.0, культура =нейтральный, PublicKeyToken = adb9793829ddae60) в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, версия = 4.0.0.0, культура = нейтральный, PublicKeyToken = 7cec85d7bea7798e) в Microsoft.AspNetCternalInont.ontCont.InCoreInont.vor.v.Microsoft.AspNetCore.Mvc.Core,Версия = 2.0.2.0, культура = нейтральная, PublicKeyToken = adb9793829ddae60) в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next (Microsoft.AspNetCore.Mvc.Core, версия = 2.0.2.0, культура = нейтральная, PublicKeyToken = adb9793829e)Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker + d__14.MoveNext (Microsoft.AspNetCore.Mvc.Core, версия = 2.0.2.0, культура = нейтральная, PublicKeyToken = adb9793829ddae60) в System.Runtime.ExceptionServices.ExceptionDrowpfoIn.CoreLib, Версия = 4.0.0.0, Культура = нейтральная, PublicKeyToken = 7cec85d7bea7798e) в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Private.CoreLib, Версия = 4.0.0.0, Культура = нейтральная, PublicKeyTokd7) 857 at 7cec.AspNetCore.Mvc.Internal.ResourceInvoker + d__22.MoveNext (Microsoft.AspNetCore.Mvc.Core, версия = 2.0.2.0, культура = нейтральная, PublicKeyToken = adb9793829ddae60) в System.Runtime.ExceptionServices.ExceptionDispatchIn.P.CoreLib, версия = 4.0.0.0, Culture = нейтральный, PublicKeyToken = 7cec85d7bea7798e) в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow (Microsoft.AspNetCore.Mvc.Core, версия = 2.0.2.0, культура = нейтральный, PublicKeyToken = adb9793829ddae60) вMicrosoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next (Microsoft.AspNetCore.Mvc.Core, версия = 2.0.2.0, культура = нейтральная, PublicKeyToken = adb9793829ddae60) в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker + d__17.Me.AspNetCore.Mvc.Core, версия = 2.0.2.0, культура = нейтральная, PublicKeyToken = adb9793829ddae60) в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken =7cec85d7bea7798e) в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Private.CoreLib, Версия = 4.0.0.0, Культура = нейтральный, PublicKeyToken = 7cec85d7bea7798e) в System.Runtime.Chill Получатель уведомления о получении ответаВерсия = 4.0.0.0, Культура = нейтральная, PublicKeyToken = 7cec85d7bea7798e) на Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker + d__15.MoveNext (Microsoft.AspNetCore.Mvc.Core, Версия = 2.0.2.0, Культура = нейтральная, PublicKeyToken = adb93838) в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = 7cec85d7bea7798e) в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Private. 4.0.0Lore.0.= нейтральный, PublicKeyToken = 7cec85d7bea7798e) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Версия = 4.0.0.0, Культура = нейтральный, PublicKeyToken = 7cec85Doug.Dever.RoDever.RuDeDever.RuDeDe.Ru.De).(Microsoft.AspNetCore.Routing, версия = 2.0.1.0, культура = нейтральная, PublicKeyToken = adb9793829ddae60) в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken =7cec85d7bea7798e) в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Private.CoreLib, Версия = 4.0.0.0, Культура = нейтральная, PublicKeyToken = 7cec85d7bea7798e) в System.Runtime.CompilerKervices.leNonSuccessAndDebuggerNotification (System.Private.CoreLib, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = 7cec85d7bea7798e) в Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware + d__11.MoveNext (версия 2.0.Ser., Культура = нейтральная, PublicKeyToken = adb9793829ddae60) в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Версия = 4.0.0.0, Культура = нейтральная, PublicKeyToken = 7cec85d7bea7798e) в системе.(System.Private.CoreLib, Версия = 4.0.0.0, Культура = нейтральная, PublicKeyToken = 7cec85d7bea7798e) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Версия = нейтральный, Version = 4.0.07cec85d7bea7798e) в Microsoft.AspNetCore.Hosting.Internal.RequestServicesContainerMiddleware + d__3.MoveNext (Microsoft.AspNetCore.Hosting, версия = 2.0.1.0, культура = нейтральная, PublicKeyToken = adb9793829ddae60) в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = 7cec85d7bea7798e) в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonLriv..0.0, Культура = нейтральная, PublicKeyToken = 7cec85d7bea7798e) в Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Frame`1 + d__2.MoveNext (Microsoft.AspNetCore.Server.Kestrel.Core, Версия = 2.0.1.0,Culture = нейтральный, PublicKeyToken = adb9793829ddae60) Внутреннее исключение System.Threading.Tasks.TaskCanceledException, обработанное в MyApplication.Logging.Controllers.ApiController.Log:

1 Ответ

0 голосов
/ 20 февраля 2019

Вас не ждут задания.Кроме того, функция Save является синхронной, поэтому Task.WaitAll(saveTasks.ToArrays()); runs synchronpusly.

По крайней мере, я ожидаю, что public void Save(LogModel logObject) будет public Task Save(LogModel logObject), а Task.WaitAll(saveTasks.ToArrays()); будет return Task.WhenAll(saveTasks.ToArrays());

public Task Save(LogModel logObject)
{
    List<Task> saveTasks = new List<Task>();
    LogInfo logInfo = logObject.logInfo;
    LogDetails logDetails = logObject.logDetails;
    saveTasks.Add(documentClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(DatabaseId, primaryLogInfoCollectionID), logInfo));
    saveTasks.Add(documentClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(DatabaseId, archieveLogInfoCollectionID), logInfo));    
    saveTasks.Add(documentClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(DatabaseId, primaryLogDetailsCollectionID), logDetails));
    saveTasks.Add(documentClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(DatabaseId, archieveLogDetailsCollectionID), logDetails));

    return Task.WhenAll(saveTasks.ToArrays());
}

, есливы намерены запустить задачу и забыть, теперь вы можете использовать _context.Save(logObject);, но в противном случае вам нужно использовать Task

другая проблема: приведенный выше код открывает 4 задачи и обрабатывает их неуправляемо.Предел одновременного выполнения по умолчанию в .Net Core равен 10. Теперь представьте, что метод Save вызывается три раза один за другим, и ни один из них еще не завершен.Это означает, что вам нужно иметь 12 одновременных задач.Но у .Net Core есть предел 10. Как я полагаю, последние две задачи будут отменены.

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