经过长时间的处理后,Azure网站超时

时间:2019-02-12 04:19:36

标签: azure azure-web-sites azure-redis-cache

团队,

我在Azure上发布了一个Azure网站。该应用程序从API读取约30000名员工,读取成功后,它将使用所有30,000名员工更新辅助Redis缓存。

超时发生在第二步中,由此它与所有员工一起更新辅助Redis缓存。从我的本地来看,它工作正常。但是,一旦我将其部署到Azure,它就会给我一个

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

从博客中我知道,azure网站的默认超时设置为4分钟。

我已经尝试了博客上提供的所有修复程序,例如将应用程序设置中的命令SCM_COMMAND_IDLE_TIMEOUT设置为3600。

我什至尝试将Azure Redis缓存会话状态提供程序设置(如上所示)以夸大的超时值放置在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 :(得分:0)

您做错了! Redis没问题。在处理完成之前,主请求线程本身将被终止。您不应该让请求等待那么长时间。正在进行中的最长230秒的飞行请求有一个严格的限制,该限制无法更改。

  

在这里阅读:Why does my request time out after 230 seconds?



假设1:您是根据客户端的第一个请求加载数据的!

解决方案:如果30000名员工记录是针对整个应用程序的,而不是针对特定用户的-您可以在应用启动时触发数据加载,而不是在用户请求时触发数据加载。


  

假设2:您有个人用户,对于每个用户,您必须根据客户端的第一个请求存储30000个员工数据。

解决方案:添加后台作业(也许是WebJob / Azure Function)来处理任务。根据客户的要求-返回202(接受标头中的工作状态位置。然后客户可以以一定频率轮询任务状态,从而相应地更新用户!

修改1: 对于假设1,您可以在将对象推送到Redis的同时尝试对其进行批处理。当前,您一次要更新一个对象,这种方式将更新30000个请求。绝对会耗尽230秒的限制。作为一种快速解决方案,请在对Redis的一个请求中批处理多个对象。我希望它能解决问题!

更新: 在使用StackExchange.Redis时-使用以下模式已批处理此处提到的对象。

Batch set data from Dictionary into Redis

每个请求的对象数取决于有效负载大小和可用带宽。由于您的网站托管在Azure上,所以我认为带宽不是什么大问题

希望有帮助!