团队,
我在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));
}
}
}
`
有什么我可以更改此代码的东西吗?
任何人都可以帮助我...我的想法已经用完了!
答案 0 :(得分:0)
您做错了! Redis没问题。在处理完成之前,主请求线程本身将被终止。您不应该让请求等待那么长时间。正在进行中的最长230秒的飞行请求有一个严格的限制,该限制无法更改。
假设1:您是根据客户端的第一个请求加载数据的!
解决方案:如果30000名员工记录是针对整个应用程序的,而不是针对特定用户的-您可以在应用启动时触发数据加载,而不是在用户请求时触发数据加载。
假设2:您有个人用户,对于每个用户,您必须根据客户端的第一个请求存储30000个员工数据。
解决方案:添加后台作业(也许是WebJob / Azure Function)来处理任务。根据客户的要求-返回202(接受标头中的工作状态位置。然后客户可以以一定频率轮询任务状态,从而相应地更新用户!
修改1: 对于假设1,您可以在将对象推送到Redis的同时尝试对其进行批处理。当前,您一次要更新一个对象,这种方式将更新30000个请求。绝对会耗尽230秒的限制。作为一种快速解决方案,请在对Redis的一个请求中批处理多个对象。我希望它能解决问题!
更新: 在使用StackExchange.Redis时-使用以下模式已批处理此处提到的对象。
Batch set data from Dictionary into Redis
每个请求的对象数取决于有效负载大小和可用带宽。由于您的网站托管在Azure上,所以我认为带宽不是什么大问题
希望有帮助!