Azure缓存来自WCF REST服务的间歇性响应时间

时间:2014-06-05 07:17:40

标签: c# asp.net wcf caching azure

我在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

目前默认为1

远程调试时,会在缓存中找到该对象,并返回缓存的对象。所以一切都很好,除了响应时间仍然相差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支持的故障单,所以当他们联系时我会更新这篇文章,并且我已经问过他们为什么他们的缓存是如此垃圾。就在我对微软的信心攀升时:/

1 个答案:

答案 0 :(得分:0)

看起来您已经得出了正确的结论,即不使用Azure托管缓存。大约6个月前,微软开始推荐所有新的开发工作都要针对Azure中基于Redis的缓存产品。

  

We recommend all new developments use Azure Redis Cache.

奇怪的是,他们没有显示在“旧”Azure管理站点(manage.windowsazure.com)中创建Redis缓存的选项,但是他们确实在“预览”Azure management portal中拥有它。 / p>