Ошибка подключения к базе данных Azure WebJob только в некоторых экземплярах

У меня есть два веб-задания Azure. Первый принимает входящее сообщение, в котором говорится, что необходимо получить PDF-файл и разбить его на отдельные изображения страниц, а затем поставить другое сообщение в очередь для второго веб-задания для обработки отдельных страниц. Он отлично работал на нашем экземпляре QC, но когда мы попытались перейти к производству, я начал получать странные ошибки на втором задании, но не постоянно. Первое задание запускается и разбивает файл на изображения страниц. Это работает нормально. Я подтвердил, что каждое изображение страницы создается и каждое сообщение страницы ставится в очередь. Однако для второго задания правильно обрабатываются только некоторые сообщения. Остальные показывают эту ошибку в диагностике WebJob:

Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Исключение при выполнении функции: Functions.ProcessBatchPage ---> System.Data.SqlClient.SqlException: Произошла ошибка, связанная с сетью или экземпляром при установлении соединения с SQL Server. Сервер не найден или не был доступен. Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен на разрешение удаленных подключений. (поставщик: Сетевые интерфейсы SQL, ошибка: 52 — Не удается найти установку среды выполнения локальной базы данных. Убедитесь, что SQL Server Express установлен правильно и включена функция среды выполнения локальной базы данных.) ---> System.ComponentModel.Win32Exception: The система не может найти указанный файл

Но что странно, так это то, что в этой ошибке упоминается среда выполнения локальной базы данных и SQL Server Express, и я нигде в своем коде не упоминаюсь. Система указывает на базу данных SQL Azure. Это работа ADO.Net, и я жестко закодировал строку подключения, чтобы попытаться устранить любые проблемы со строками подключения на основе конфигурации. Но что странно, это происходит только с определенной частью сообщений. Остальные обрабатывают отлично.

Наконец, я выполнил задание в режиме отладки локально (все еще указывая на настоящую очередь и БД в Azure) и столкнулся с той же проблемой. Но задание выводит строку консоли с идентификатором задания в качестве первой строки кода. Для тех заданий, которые обрабатываются успешно, я вижу эту строку записи. Для тех, кто терпит неудачу, я никогда ничего не вижу. Это похоже на то, что работа на самом деле не запускается правильно. (неудачные задания также имеют очень короткое время выполнения 50-100 мс)


person Bryan Lewis    schedule 12.03.2016    source источник
comment
Можете ли вы опубликовать файл app.config, который развертывается в Azure? Если вы используете EF, можете ли вы опубликовать, как вы устанавливаете строку подключения?   -  person lopezbertoni    schedule 12.03.2016
comment
Не использую EF вообще. У меня были проблемы с EF в webjob, поэтому я переписал прямо с ADO.net. Он имеет оператор SQLConnection с жестко заданной строкой подключения. Раньше у меня был CS в app.config, но я жестко закодировал его в webjob functions.cs, чтобы попытаться устранить эту проблему.   -  person Bryan Lewis    schedule 12.03.2016


Ответы (1)


У меня была такая же проблема с некоторыми заданиями, и я наткнулся на эти статьи, чтобы найти решение:

Из этих статей :

Причины временных сбоев:

В облачной среде вы обнаружите, что периодически происходят сбои и разрывы соединений с базой данных. Отчасти это связано с тем, что вы используете больше балансировщиков нагрузки по сравнению с локальной средой, где ваш веб-сервер и сервер базы данных имеют прямое физическое соединение. Кроме того, иногда, когда вы зависите от многопользовательской службы, вы увидите, что вызовы службы становятся медленнее или время ожидания истекает, потому что кто-то другой, использующий службу, сильно ее бьет. В других случаях вы можете быть пользователем, который слишком часто обращается к службе, и служба преднамеренно ограничивает вас — отказывает в подключении — чтобы предотвратить негативное воздействие на других клиентов службы.

Используйте интеллектуальную логику повторных/отложенных попыток, чтобы смягчить последствия временных сбоев:

У группы Microsoft Patterns & Practices есть приложение для обработки временных сбоев. Block, который делает все за вас, если вы используете ADO.NET для доступа к базе данных SQL (не через Entity Framework). Вы просто устанавливаете политику для повторных попыток — сколько раз повторять запрос или команду и как долго ждать между попытками — и заключаете свой код SQL в блок using:

public void HandleTransients()
{
   var connStr = "some database";
   var _policy = RetryPolicy.Create < SqlAzureTransientErrorDetectionStrategy(
    retryCount: 3,
    retryInterval: TimeSpan.FromSeconds(5));

    using (var conn = new ReliableSqlConnection(connStr, _policy))
    {
        // Do SQL stuff here.
    }
}

Когда вы используете Entity Framework, вы обычно не работаете напрямую с соединениями SQL, поэтому вы не можете использовать этот пакет Patterns and Practices, но Entity Framework 6 встраивает такую ​​логику повторных попыток прямо в платформу. . Аналогичным образом вы указываете стратегию повторных попыток, а затем EF использует эту стратегию всякий раз, когда обращается к базе данных.

Чтобы использовать эту функцию в приложении Fix It, все, что нам нужно сделать, это добавить класс, производный от DbConfiguration, и включить логику повторных попыток.

// EF follows a Code based Configuration model and will look for a class that
// derives from DbConfiguration for executing any Connection Resiliency strategies
public class EFConfiguration : DbConfiguration
{
    public EFConfiguration()
    {
        AddExecutionStrategy(() => new SqlAzureExecutionStrategy());
    }
}
person Thomas    schedule 13.03.2016
comment
Спасибо, Томас. Я использую ADO.net, и добавление кода TFHAB, похоже, устранило эту ошибку. Хотя я все равно должен был использовать его, но ошибка, связанная с SQL Server Express, заставила меня задуматься! - person Bryan Lewis; 14.03.2016