我在Azure中构建了一个EF6 Web应用程序,并且我正在使用Azure Cache。 我正在测试对我的WCF服务的调用,并且我的响应时间非常不稳定 - 在300毫秒到15秒之间!
我根据this example配置了我的代码,并在本地运行良好
我已经远程调试了,我可以看到正在找到缓存密钥并且数据是从缓存调用的,所以我很难理解为什么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;
}
}
UserConnection是我的数据库中的一个简单表,当前没有数据,因此该调用返回一个空的JSON数组。 user
是一个Session对象,user.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>
但我仍然会得到如此不稳定的响应时间 - 特别是在重复点击相同的服务呼叫时。
添加maxbuffersize配置后,缓存调用仍然是命中注定。一些人获取对象;其他时候我得到相同的例外,但端口是不同的
&#34; ...客户端正在尝试与服务器通信:net.tcp://ekckodev.cache.windows.net:22233。&#34;}&#34;
这可能是防火墙问题吗?如果是这样,我该如何打开相应的端口?
在实例化DataCache对象时,我也遇到了以下异常:
_cache = cacheFactory.GetDefaultCache();
ErrorCode:SubStatus:暂时失败。请稍后重试。 (一个或多个指定的缓存服务器不可用,这可能是由繁忙的网络或服务器引起的。 对于内部部署缓存群集,还要验证以下条件。确保安全权限 已被授予此客户帐户,并检查是否允许AppFabric缓存服务通过 所有缓存主机上都有防火墙此外,服务器上的MaxBufferSize必须大于或等于 从客户端发送的序列化对象大小。)
有关我为何获得此类结果的任何想法?它的缓存肯定不比WIHTOUT快,所以看起来缓存中有某种延迟似乎不对......
提前感谢您的帮助!
更新: 在做了一些搜索之后,似乎我不是唯一一个有这个问题的人: poor performance with azure cache
我发现很难相信这是我应该期待的表现
更新2 我已经从我的服务中注释掉了所有与缓存相关的代码,并再次运行相同的测试。没有缓存,响应时间明显更低! &#34; getFriends&#34;在缓存中大约250毫秒,但缓存高峰时间超过5秒。 我获取大约4kb数据的另一种方法是使用缓存达到20秒以上,现在平均大约2秒没有缓存。
再次:我发现很难相信这是我应该期待的表现
更新3 我现在已经取消了Azure Cache,转而使用MemoryCache。很好的例子here 我的服务电话现在在浏览器中持续约300毫秒。
我已经开通了一个关于Azure Cache的Microsoft Azure支持的故障单,所以当他们联系时我会更新这篇文章,并且我已经问过他们为什么他们的缓存是如此垃圾。就在我对微软的信心攀升时:/
答案 0 :(得分:0)
看起来您已经得出了正确的结论,即不使用Azure托管缓存。大约6个月前,微软开始推荐所有新的开发工作都要针对Azure中基于Redis的缓存产品。
奇怪的是,他们没有显示在“旧”Azure管理站点(manage.windowsazure.com)中创建Redis缓存的选项,但是他们确实在“预览”Azure management portal中拥有它。 / p>