Получение временных ошибок при выполнении вызовов базы данных SQL Azure из функции Azure - PullRequest
0 голосов
/ 14 января 2019

Мы используем .NET Core 2.1 и Entity Framework Core 2.1.1

У меня есть следующие настройки в Azure West Europe

  • База данных SQL Azure - Премиум P2 250 DTU - Общедоступная конечная точка, нет пиринга VNET - «Разрешить доступ к службам Azure» = ВКЛ.

  • Функции Azure - План потребления - Тайм-аут 10 минут

  • хранилище BLOB-объектов Azure - горячий уровень

Несколько BLOB-объектов загружаются в хранилище BLOB-объектов Azure. Функции Azure (до 5 одновременно) запускаются с помощью таблицы событий Azure. Функции Azure проверяют структуру больших двоичных объектов по метаданным, хранящимся в базе данных SQL Azure. Каждый BLOB-объект содержит до 500 тыс. Записей и 5 столбцов данных полезной нагрузки. Для каждой записи функции Azure выполняют вызов базы данных SQL Azure, поэтому кэширование не выполняется.

Я получаю часто, когда несколько больших двоичных объектов обрабатываются параллельно (до 5 асинхронных вызовов функций Azure одновременно) и когда размер большого двоичного объекта больше 200K-500K записей, следующие ошибки переходного процесса и подключения из .NET Базовая структура Entity:

1. Возникло исключение, которое, вероятно, связано с временной ошибкой. Подумайте о том, чтобы включить устойчивость к временным ошибкам, добавив метод EnableRetryOnFailure () к вызову UseSqlServer.

2. Соединение с сервером было успешно установлено, но во время рукопожатия перед входом в систему произошла ошибка. (поставщик: поставщик SSL, ошибка: 0 - истекло время ожидания операции ожидания.)

3. Время ожидания соединения истекло. Период ожидания истек при попытке использовать подтверждение рукопожатия перед входом в систему. Это может быть связано с тем, что рукопожатие до входа в систему не удалось или сервер не смог ответить вовремя. Эта ошибка произошла при попытке подключиться к месту назначения маршрутизации. Длительность попытки подключения к исходному серверу составила - [Pre-Login] initialization = 13633; квитирование = 535; [Логин] инициализация = 1; Аутентификация = 0; [Post-Login] завершено = 156; Продолжительность попытки подключения к этому серверу составила - [Pre-Login] initialization = 5679; квитирования = 2044;

4. Соединение с сервером было успешно установлено, но во время рукопожатия перед входом в систему произошла ошибка. (поставщик: поставщик SSL, ошибка: 0 - истекло время ожидания операции ожидания.)

  1. Сервер предоставил информацию о маршрутизации, но время ожидания уже истекло.

В то же время во время теста для базы данных SQL Azure не сообщалось о каких-либо событиях работоспособности, и показатели выглядят потрясающе: MAX Workers <3,5%, сумма успешных подключений <35, процент сеансов MAX <0,045%, макс. Процент пользовательского интерфейса журнала <0,024%, сумма неудачных соединений = 0, максимальный DTU <10%, максимальный ввод-вывод данных <0,055%, максимальный процессор <10%. </p>

Выполнение статистики подключений в базе данных SQL Azure (sys.database_connection_stats_ex): нет неудачных, прерванных или ограниченных подключений.

select *
from sys.database_connection_stats_ex
where start_time >= CAST(FLOOR(CAST(getdate() AS float)) AS DATETIME)
order by start_time desc

Кто-нибудь сталкивался с подобными проблемами в сочетании с .Net Core Entity Framework и базой данных SQL Azure. Почему я получаю эти временные ошибки, почему показатели базы данных SQL Azure выглядят так хорошо, даже не отражая их наличие?

Заранее большое спасибо за любую помощь.

using Microsoft.EntityFrameworkCore;

namespace MyProject.Domain.Data
{
    public sealed class ApplicationDbContextFactory : IApplicationDbContextFactory
    {
        private readonly IConfigurationDbConfiguration _configuration;
        private readonly IDateTimeService _dateTimeService;

        public ApplicationDbContextFactory(IConfigurationDbConfiguration configuration, IDateTimeService dateTimeService)
        {
            _configuration = configuration;
            _dateTimeService = dateTimeService;
        }

        public ApplicationDbContext Create()
        {
            //Not initialized in ctor due to unit testing static functions.
            var options = new DbContextOptionsBuilder<ApplicationDbContext>()
                .UseSqlServer(_configuration.ConfigurationDbConnectionString).Options;

            return new ApplicationDbContext(options, _dateTimeService);
        }
    }
}

1 Ответ

0 голосов
/ 27 января 2019

Я нашел эту хорошую документацию по временным ошибкам базы данных sql:

Из документации:

Временная ошибка имеет основную причину, которая вскоре устраняется. Случайной причиной временных ошибок является случай, когда система Azure быстро переключает аппаратные ресурсы для лучшей балансировки нагрузки при различных рабочих нагрузках. Большинство из этих событий реконфигурации заканчиваются менее чем за 60 секунд. В течение этого промежутка времени у вас могут возникнуть проблемы с подключением к базе данных SQL. Приложения, которые подключаются к базе данных SQL, должны быть сконструированы так, чтобы ожидать этих временных ошибок Чтобы справиться с ними, используйте логику повторных попыток в своем коде вместо того, чтобы показывать их пользователям как ошибки приложения.

Затем подробно объясняется, как построить логику повторения для переходных ошибок.

Entity Framework с SQL-сервером реализует логику повторных попыток:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder
        .UseSqlServer("<connection string>", options => options.EnableRetryOnFailure());
}

Вы можете найти больше информации здесь:

...