Мы используем .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 - истекло время ожидания операции ожидания.)
- Сервер предоставил информацию о маршрутизации, но время ожидания уже истекло.
В то же время во время теста для базы данных 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);
}
}
}