Тайм-аут SQL Server в течение 2 минут при масштабировании моего приложения ASP.NET Core в AWS ECS

У меня возникла проблема с моим приложением ASP.NET Core 6, работающим на AWS ECS (Fargate).

Мое приложение использует клиент SQL для выполнения запросов SQL. Когда, например, запущено 10 экземпляров, все работает хорошо.

Но чтобы правильно масштабировать мой сервис в соответствии с объемом трафика, у меня есть работа, которая запускает и масштабирует мой сервис ECS. Например, если я ожидаю гораздо большего трафика, задание увеличит количество задач с 10 до 15.

Проблема возникает после развертывания Blue/Green. Как только мои новые задачи выполняются (проверка работоспособности в порядке), балансировщик нагрузки приложения отправляет трафик на новые задачи. Но в течение первых двух минут после того, как новые задачи начали получать трафик, я сталкиваюсь с таймаутами SQL. По истечении этого времени тайм-ауты исчезают, и новые задачи должным образом обрабатывают SQL-запросы.

Вот логи моих новых задач:

Я не понимаю, почему я сталкиваюсь с тайм-аутами SQL, но только в начале выполнения моего приложения.

Что я уже пытался сделать:

  • Указание порта SQL Server в строке подключения
  • Установка атрибута Min Pool Size на 100 в моей строке подключения
  • Открытие первого SqlDbConnection в моем Program.cs, чтобы разрешить доменное имя моего прослушивателя SQL Server.

Что я могу сделать, чтобы больше не получать эти таймауты?

Где работает SQL Server? РДС?

Mark B 10.07.2024 17:51

У меня есть две среды: одна на экземпляре EC2, а другая на RDS. И я столкнулся с этой проблемой на обоих

Hugo H 10.07.2024 18:04

Похоже, среда для этих задач не готова полностью до 2 минут? Например, ваша сеть. Разве проверка работоспособности не должна включать в себя сетевые данные?

siggemannen 10.07.2024 18:29

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

Hugo H 10.07.2024 19:20

Итак, у вас при запуске есть рабочее соединение, но потом оно перестает работать, как только вы включаете маршрутизацию? Звучит подозрительно

siggemannen 10.07.2024 19:45

Да, поэтому я ничего не понимаю из того, что происходит

Hugo H 10.07.2024 19:53

Что такое SqlDbConnection? Учитывая сообщения об ошибках на вашем снимке экрана (которые, кстати, должны были быть включены в виде текста, а не снимков экрана), это звучит как сторонний класс-оболочка для устаревших System.Data.SqlClient объектов , которые не получали обновлений функций с 2019 года . Поскольку вы больше не используете .NET Framework, почему вы не используете более современные и активно разрабатываемые Microsoft.Data.SqlClient классы?

AlwaysLearning 10.07.2024 23:53

Мы используем внутреннюю оболочку, которая используется и является общей для приложений, работающих на .NET Framework и .NET Core. Это основная причина. Я перешел на Microsoft.Data.SqlClient, но это ничего не меняет. Но мне удалось потенциально решить проблему, выполнив базовую команду SQL при запуске приложения (SELECT 1;). Кажется, что выполнение первого запроса перед получением трафика (тысячи HTTP-запросов, то есть тысячи SQL-запросов) решает проблему: я больше не получаю никаких тайм-аутов.

Hugo H 11.07.2024 09:36

@AlwaysLearning which should have been included as text, by the way, not screen shots извини, приятель, я не трачу всю свою жизнь на StackOverflow, поэтому не знаком со всеми лучшими практиками. В будущем я буду включать журналы в виде текста.

Hugo H 11.07.2024 09:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, что получение трафика без хотя бы одного выполнения SQL-запроса приводит к этим тайм-аутам.

Выполнение первого запроса SQL во время запуска приложения решило проблему.

Что я предлагаю:

  • Интегрируйте проверку работоспособности базы данных в свои проверки работоспособности (в моем случае это не то, что я хочу).
  • Или выполните простой SQL-запрос во время запуска приложения SELECT 1;

Я выпустил исправление в производство, и у меня больше нет тайм-аутов.

Если у кого-нибудь есть объяснение, почему это так работает? (даже если да, я согласен, что это грязное решение)

«Похоже, что получение трафика без хотя бы одного выполнения SQL-запроса приводит к этим тайм-аутам». - это похоже на симптом, а не на настоящую причину. stackoverflow.com/questions/10606720/… Я считаю, что вам нужно изменить строку подключения и установить для MultiSubnetFailover значение «TRUE». techcommunity.microsoft.com/t5/sql-server-support-blog/…

Mitch Wheat 12.07.2024 07:38

Спасибо за ваш комментарий, но для свойства MultiSubnetFailover уже было установлено значение «True», и оно так не работало.

Hugo H 12.07.2024 08:48

Другие вопросы по теме