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

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支持的故障单,因此我会在他们联系时更新这篇文章,并且我已经问过他们为什么他们的缓存是如此垃圾.就在我对微软的信心攀升时:/

Dus*_*sty 0

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

我们建议所有新开发都使用 Azure Redis 缓存。

奇怪的是,他们没有在“旧”Azure 管理站点 (manage.windowsazure.com) 中显示创建 Redis 缓存的选项,但在“预览版” Azure 管理门户中确实有该选项。