Функции Azure static SqlConnection - правильный масштаб?
Я использую функции Azure с триггерами очереди для части нашей рабочей нагрузки. Специальная функция запрашивает базу данных, и это создает проблемы с масштабированием, так как большое количество одновременных экземпляров функции, проверяющих db, приводит к тому, что максимально допустимое число соединений с базой данных Azrue постоянно поражается.
В этой статье https://docs.microsoft.com/en-us/azure/azure-functions/manage-connections перечисляется HttpClient как один из тех ресурсов, которые следует сделать статическими. Должен ли доступ к базе данных также быть статическим со статическим SqlConnection для решения этой проблемы, или это вызовет некоторые другие проблемы, если сохранить объект постоянного соединения?
2 ответа
Если доступ к базе данных также будет сделан статическим со статическим SqlConnection
Точно нет. Каждый вызов функции должен открывать новый SqlConnection с той же строкой соединения в блоке using. Не совсем понятно, сколько одновременных вызовов функций будет выполнять среда выполнения для одного экземпляра вашего приложения. Но если оно больше 1, то одноэлементное SqlConnection - это плохо.
Интересно, какой именно предел вы устанавливаете в базе данных SQL, лимит соединения или лимит одновременных запросов? В любом случае я немного удивлен (не эксперт по функциям), что вы получаете столько одновременных вызовов функций, так что может произойти что-то еще. Как будто вы пропускаете SqlConnections.
Но, читая документы по функциям, я предполагаю, что время выполнения функций масштабируется путем запуска нескольких экземпляров приложения-функции. Ваше приложение.NET может масштабироваться в одном процессе, но, очевидно, это не так, как работает функция. Каждый экземпляр вашего приложения Functions имеет свой собственный ConnectionPool для SQL Server, и по умолчанию каждый ConnectionPool может иметь 100 соединений.
Возможно, если вы резко ограничите максимальный размер пула в строке подключения, не будет так много открытых соединений. Когда вы нажмете Максимальный размер пула, новые вызовы SqlConnection.Open() будут блокироваться на срок до 30 секунд, ожидая доступности пула SqlConnection. Так что это не только ограничивает использование соединения для каждого экземпляра вашего приложения, но и снижает пропускную способность под нагрузкой.
Вы можете использовать параметры конфигурации в host.json, чтобы управлять уровнем параллелизма, на котором выполняются ваши функции для каждого экземпляра, и настройкой максимального масштабирования, чтобы контролировать, сколько экземпляров вы масштабируете. Это позволит вам контролировать общую нагрузку на вашу базу данных.
Для будущих читателей документация была обновлена с некоторой информацией о соединении SQL, заявляя:
Ваш функциональный код может использовать поставщик данных.NET Framework для SQL Server (SqlClient) для подключения к реляционной базе данных SQL. Это также основной поставщик платформ данных, основанных на ADO.NET, таких как Entity Framework. В отличие от соединений HttpClient и DocumentClient, ADO.NET по умолчанию реализует пул соединений. Тем не менее, поскольку у вас все еще не хватает соединений, вам следует оптимизировать соединения с базой данных. Дополнительные сведения см. В разделе "Пулы соединений с SQL Server" (ADO.NET).
Итак, как уже упоминал Дэвид Браун, вы не должны делать SqlConnection
статичный.