Тайм-аут сайта Azure после длительного процесса - PullRequest
0 голосов
/ 12 февраля 2019

Team,

У меня есть веб-сайт Azure, опубликованный в Azure.Приложение считывает около 30000 сотрудников из API и после успешного чтения обновляет вторичный кэш Redis со всеми 30 000 сотрудников.

Тайм-аут наступает на втором этапе, когда он обновляет вторичный кэш Redis со всеми сотрудниками.С моего местного это нормально работает.Но как только я разверну это в Azure, он даст мне

500 - The request timed out.
The web server failed to respond within the specified time

. Из блогов я узнал, что для веб-сайта Azure по умолчанию установлено время ожидания 4 минуты.

Я перепробовал все исправления, представленные в блогах, например, установил команду SCM_COMMAND_IDLE_TIMEOUT в настройках приложения на 3600.

Я даже попытался установить параметры поставщика состояния сеанса кэширования Redis-кэша Azure, как это было в web.config с завышенным тайм-аутомцифры. <add type="Microsoft.Web.Redis.RedisSessionStateProvider" name="MySessionStateStore" host="[name].redis.cache.windows.net" port="6380" accessKey="QtFFY5pm9bhaMNd26eyfdyiB+StmFn8=" ssl="true" abortConnect="False" throwOnError="true" retryTimeoutInMilliseconds="500000" databaseId="0" applicationName="samname" connectionTimeoutInMilliseconds="500000" operationTimeoutInMilliseconds="100000" />

Код ошибки, ответственный за тайм-аут, таков: `

public void Update(ReadOnlyCollection<ColleagueReferenceDataEntity> entities) 
{ 
//Trace.WriteLine("Updating the secondary cache with colleague data"); 
var secondaryCache = this.Provider.GetSecondaryCache(); 

foreach (var entity in entities) 
{ 
try 
{ 
secondaryCache.Put(entity.Id, entity); 
} 
catch (Exception ex) 
{ 
// if a record fails - log and continue. 
this.Logger.Error(ex, string.Format("Error updating a colleague in secondary cache: Id {0}, exception {1}", entity.Id)); 
} 
} 
}

`

Могу ли я внести какие-либо изменения в этот код?

Пожалуйста, кто-нибудь может мне помочь ... у меня закончились идеи!

1 Ответ

0 голосов
/ 12 февраля 2019

Вы делаете это неправильно!Redis не проблема.Сам основной поток запросов завершается до завершения процесса.Вы не должны позволить запросу ждать так долго.Существует жестко заданное ограничение для запросов в полете, составляющее 230 секунд * макс. 1002 *, которое нельзя изменить.

Читайте здесь: Почему мой запрос истекает через 230 секунд?



Предположение № 1:Вы загружаете данные по самому первому запросу со стороны клиента!

Решение: Если запись о 30000 сотрудников предназначена для всего приложения, а не для конкретного пользователя - выможет инициировать загрузку данных при запуске приложения, а не по запросу пользователя.


Предположение № 2: У вас есть отдельные пользователи и для каждого из нихВы должны хранить данные 30000 сотрудников по первому запросу со стороны клиента.

Решение: Добавить фоновое задание (возможно, функцию WebJob / Azure) для обработкизадание.По запросу клиента - вернуть 202 (Принимается с указанием местоположения статуса работы в заголовке. Затем клиент может запрашивать состояние задачи с определенной частотой, обновляя пользователя соответствующим образом!

Редактировать1: Для предположения № 1 - Вы можете попробовать пакетировать объекты, одновременно отправляя объекты в Redis. В настоящее время вы обновляете один объект за один раз, что приведет к 30000 запросам таким образом.ограничение в секундах. В качестве быстрого решения, пакетируйте несколько объектов в одном запросе к Redis. Я надеюсь, что это должно сработать!

ОБНОВЛЕНИЕ: Поскольку вы используете StackExchange.Redis - используйтеследующий шаблон для пакетирования объектов, упомянутых здесь уже.

Пакетный набор данных из словаря в Redis

Количество объектов на запросы варьируется в зависимости от размера полезной нагрузки и доступной пропускной способностиПоскольку ваш сайт размещен в Azure, я не думаю, что пропускная способность будет иметь большое значение

Надеюсь, это поможет!

...