Ada*_*Hey 6 c# asp.net wcf caching azure
我正在Azure中构建一个EF6 Web应用程序,我正在使用Azure Cache.我正在测试对我的WCF服务的调用,而且我的响应时间非常不稳定 - 在300毫秒到15秒之间!
我根据这个例子配置了我的代码,它在本地运行正常
我已经远程调试了,我可以看到正在找到缓存密钥并且数据是从缓存中调用的,所以我很难理解为什么sych的响应时间变化很大.大多数情况下它是5 +秒,这显然是太长了.
我一直在测试的例子如下:
WCF服务GET请求:http: //feniksdev-staging.azurewebsites.net/EkckoNewsService.svc/getFriends
// Cache client configured by settings in application configuration file.
public DataCacheFactory cacheFactory = new DataCacheFactory();
public DataCache _cache;
public DataCache cache
{
get
{
if (_cache == null)
_cache = cacheFactory.GetDefaultCache();
return _cache;
}
set { }
}
...
...
[OperationContract]
[System.ServiceModel.Web.WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "/getFriends")]
public string getFriends()
{
string cachekey = "getFriends/{" + user.Id + "}";
object result = cache.Get(cachekey);
if (result == null)
{
using (EkckoContext entities = new EkckoContext())
{
var frnds = entities.UserConnections.Where(uc => uc.UserId == user.Id).Select(uc => new { Name = uc.Friend.Username }).ToList();
JsonSerializerSettings jsonSettings = new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects };
string json = JsonConvert.SerializeObject(frnds, jsonSettings);
cache.Add(cachekey, json);
return json;
}
}
else
{
return (string)result;
}
}
Run Code Online (Sandbox Code Playgroud)
UserConnection是我的数据库中的一个简单表,目前没有数据,因此该调用返回一个空的JSON数组.user是一个Session对象,当前默认为1user.Id
远程调试时,在缓存中找到该对象,并返回缓存的对象.所有好的,除了响应时间仍然变化20倍(300毫秒 - 6秒).
远程调试其他Web服务方法之一时,尝试使用相应的键(object result = cache.Get(cachekey);)访问缓存对象时出现以下错误:
{"ErrorCode:SubStatus:存在临时故障.请稍后重试.(一个或多个指定的缓存服务器不可用,这可能是由繁忙的网络或服务器引起的.对于内部部署缓存集群,还要验证以下条件.确保已为此客户端帐户授予安全权限,并检查是否允许AppFabric缓存服务通过所有缓存主机上的防火墙.服务器上的MaxBufferSize必须大于或等于从客户端发送的序列化对象大小.其他信息:客户端正在尝试与服务器通信:net.tcp://ekckodev.cache.windows.net:22238."}
然后我在配置中设置maxBufferSize,如下所示:
<configSections>
<section name="dataCacheClients" type="Microsoft.ApplicationServer.Caching.DataCacheClientsSection, Microsoft.ApplicationServer.Caching.Core" allowLocation="true" allowDefinition="Everywhere" />
<section name="cacheDiagnostics" type="Microsoft.ApplicationServer.Caching.AzureCommon.DiagnosticsConfigurationSection, Microsoft.ApplicationServer.Caching.AzureCommon" allowLocation="true" allowDefinition="Everywhere" />
</configSections>
...
...
<system.web>
...
...
<caching>
<outputCache defaultProvider="AFCacheOutputCacheProvider">
<providers>
<add name="AFCacheOutputCacheProvider" type="Microsoft.Web.DistributedCache.DistributedCacheOutputCacheProvider, Microsoft.Web.DistributedCache" cacheName="default" dataCacheClientName="default" applicationName="AFCacheOutputCache" />
</providers>
</outputCache>
</caching>
</system.web>
....
....
...
<dataCacheClients>
<dataCacheClient name="default">
<autoDiscover isEnabled="true" identifier="ekckodev.cache.windows.net" />
<localCache isEnabled="true" sync="TimeoutBased" objectCount="100000" ttlValue="300" />
<securityProperties mode="Message" sslEnabled="false">
<messageSecurity authorizationInfo="xxxxxxxxxxxxxxxxxxxxxxx" />
</securityProperties>
<transportProperties connectionBufferSize="131072" maxBufferPoolSize="268435456"
maxBufferSize="8388608" maxOutputDelay="2" channelInitializationTimeout="60000"
receiveTimeout="600000"/>
</dataCacheClient>
</dataCacheClients>
Run Code Online (Sandbox Code Playgroud)
但我仍然会得到如此不稳定的响应时间 - 特别是在反复拨打相同的服务电话时.
添加maxbuffersize配置后,缓存调用仍然是命中注册.一些人获取对象; 其他时候我得到相同的例外,但端口是不同的
"...客户端正在尝试与服务器通信:net.tcp://ekckodev.cache.windows.net:22233."}"
这可能是防火墙问题吗?如果是这样,我该如何打开相应的端口?
我在实例化DataCache对象时也遇到了以下异常:
_cache = cacheFactory.GetDefaultCache();
ErrorCode:SubStatus:暂时失败.请稍后重试.(一个或多个指定的缓存服务器不可用,这可能是由繁忙的网络或服务器引起的.对于内部部署缓存集群,还要验证以下条件.确保已为此客户端帐户授予安全权限,并检查AppFabric允许缓存服务通过所有缓存主机上的防火墙.服务器上的MaxBufferSize也必须大于或等于从客户端发送的序列化对象大小.)
关于为什么我得到这样的结果的任何想法?高速缓存肯定不比WIHTOUT更快,所以看起来缓存中有某种延迟似乎不对......
在此先感谢您的帮助!
更新:经过一些更多的搜索,似乎我不是唯一一个有这个问题的人: 使用azure缓存的性能很差
我发现很难相信这是我应该期待的表现
更新2 我已经从我的服务中注释掉了所有与缓存相关的代码,并再次运行相同的测试.没有缓存,响应时间明显更低!"getFriends"的缓存大约在缓存中大约250毫秒,但在缓存中达到峰值超过5秒.我获取大约4kb数据的另一种方法是使用缓存达到20秒以上,现在平均大约2秒没有缓存.
再说一遍:我发现很难相信这是我应该期待的表现
更新3 我现在已经取消了Azure Cache,转而使用MemoryCache.这里很好的例子 我的服务电话现在在浏览器中持续约300毫秒.
我已经打开了一张关于Azure Cache的Microsoft Azure支持的故障单,因此我会在他们联系时更新这篇文章,并且我已经问过他们为什么他们的缓存是如此垃圾.就在我对微软的信心攀升时:/
看起来您已经得出了正确的结论,即不要使用 Azure 托管缓存。大约 6 个月前,微软开始建议所有新开发都针对 Azure 中基于 Redis 的缓存产品进行。
奇怪的是,他们没有在“旧”Azure 管理站点 (manage.windowsazure.com) 中显示创建 Redis 缓存的选项,但在“预览版” Azure 管理门户中确实有该选项。
| 归档时间: |
|
| 查看次数: |
454 次 |
| 最近记录: |