Максимальное количество параллельных задач в консольном приложении и способы обработки «Ошибка при копировании контента в поток» при вызове API - PullRequest
0 голосов
/ 26 мая 2020

Я работаю над интеграцией, которая обрабатывает несколько больших наборов данных (около 3 млн записей или около того, ежедневно растущих), которые поступают из API OData поставщика по частям. Когда я запускаю его / отлаживаю локально, интеграция завершится без ошибок. Однако, как только я выложу его на наш PROD-сервер, он иногда выдает ошибку «Ошибка при копировании контента в поток» для данного блока данных. У меня проблемы с выяснением причины, и мне нужна помощь.

Каждый запрос заключен в оператор using и должен аккуратно избавляться от самого себя. Обычно это так. Опять же, все это отлично работает на моем локальном компьютере, но у сервера возникают проблемы после того, как он извлекает миллионы записей. Я добавил дополнительное ведение журнала практически на каждом этапе, чтобы отловить конкретную ошибку c, но до сих пор не ясно, как обработать (или избежать) эту ошибку. Это совершенно непоследовательно ... полностью прерывисто и непоследовательно.

Код, в котором возникает ошибка:

using (WebRequestHandler webRequestHandler = new WebRequestHandler())
{
    using (HttpClient httpClient = new HttpClient(webRequestHandler))
    {
        httpClient.Timeout = TimeSpan.FromMinutes(15);

        ConfigureJsonClient(httpClient, syncConfig.ApiEndpoint, syncConfig.ApiAuthKey);

        apiCommand = "http://foo/with/filtering";

        responseMessage = Task.Run(async () => await httpClient.GetAsync(apiCommand)
            .ConfigureAwait(true)).Result;
    }
}

Ошибка:

API Error Occurred - RETRYING... Foo: 2 | API CALL: https://foo... | EXCEPTION: One or more errors occurred. | INNER EXCEPTION: Error while copying content to a stream. | STACKTRACE:    at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
       at FooNamespace.Processor.GetDataFromApi(SyncConfig syncConfig, String collection, List`1 nonDatedCollectionList, Int32 skipIndex, Int32 retryCount, Int32 taskId)

I Я также пытаюсь выполнить как можно больше параллельных задач, чтобы вытащить эти большие наборы данных в заранее определенные блоки (страницы данных), используя skip / take. Независимо от того, что я делаю, даже локально, максимальное количество задач, которые я могу развернуть параллельно, равно 40. Есть ли причина для этого ограничения?

Возможно ли, что параллельные задачи каким-то образом конфликтуют друг с другом, когда попадает в API? Они должны выглядеть как полностью отдельные, изолированные вызовы ...

Любая помощь приветствуется.

...