Вызовы API с длинным запросом к БД, возвращающим время ожидания шлюза, несмотря на увеличение времени ожидания
Я использую Entity Framework 6 для доступа к SQL Server в приложении API. Сервер API и сервер БД разделены. У меня есть известный длинный запрос, выполнение которого занимает чуть больше минуты. Я установил CommandTimeout на моем EF DbContext, используя следующий код:
db.Database.CommandTimeout = 20 * 60; // 20 minutes
К сожалению, это, похоже, не оказывает какого-либо влияния, потому что время запроса истекает менее чем за минуту, и сервер возвращает ошибку 504 Gateway Timeout.
Почему это изменение не влияет на ограничение времени выполнения команды?
Есть ли что-то еще, что я должен сделать, чтобы этот запрос выполнялся дольше?
Еще несколько деталей:
Я написал настольное приложение, которое выполняет вызовы API к серверу API, который, в свою очередь, выполняет запросы к серверу БД. На стороне настольного приложения я установил свойство HttpClient:
httpClient = new HttpClient { Timeout = new TimeSpan( 0, 20, 0 ) };
На стороне сервера API я установил тайм-аут выполнения:
<system.web>
<httpRuntime requestPathInvalidCharacters="" maxRequestLength="2097151" executionTimeout="30000" />
</system.web>
А на сервере API я установил время ожидания команды SQL, как указано выше.
В какой-то момент ответ всегда заканчивается спустя чуть меньше минуты, несмотря на то, что я установил все тайм-ауты, которые я могу придумать, равными 20 минутам. Я предположил, что 504 был вызван тайм-аутом БД, но, скорее всего, он находится между настольным приложением и сервером API.
Несмотря на это, у меня заканчиваются идеи, поэтому все поможет.
1 ответ
Оказывается, был еще один тайм-аут, о котором я не думал. Поскольку я размещаю API и серверы баз данных в Amazon Web Services с помощью Elastic Beanstalk, между моим настольным приложением и сервером API был балансировщик нагрузки. Время ожидания по умолчанию составляет 60 секунд. Вот ссылка для увеличения настроек тайм-аута балансировщика нагрузки:
http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/config-idle-timeout.html