AppFabric Cache并发问题?

Fra*_*dos 7 appfabric

在对我们全新的主系统进行压力测试时,我遇到了AppFabric Cache的并发问题.当同时使用相同的cacheKey调用许多DataCache.Get()和Put()时,我尝试存储相对较大的objet,我收到"ErrorCode:SubStatus:暂时失败.请稍后重试." 它可以通过以下代码重现:

        var dcfc = new DataCacheFactoryConfiguration
        {
            Servers = new[] {new DataCacheServerEndpoint("localhost", 22233)},
            SecurityProperties = new DataCacheSecurity(DataCacheSecurityMode.None, DataCacheProtectionLevel.None),
        };

        var dcf = new DataCacheFactory(dcfc);
        var dc = dcf.GetDefaultCache();

        const string key = "a";
        var value = new int [256 * 1024]; // 1MB

        for (int i = 0; i < 300; i++)
        {
            var putT = new Thread(() => dc.Put(key, value));
            putT.Start();               

            var getT = new Thread(() => dc.Get(key));
            getT.Start();
        }
Run Code Online (Sandbox Code Playgroud)

使用不同的密钥调用Get()或同步DataCache时,不会出现此问题.如果DataCache是​​从DataCacheFactory的每次调用获得的(DataCache应该是线程安全的)或延长超时,它就没有效果,仍然会收到错误.在我看来MS很遗憾会留下这样的错误.有没有人遇到过类似的问题?

Dav*_*uda 7

我也看到了相同的行为,我的理解是这是设计的.缓存包含两个并发模型:

  • 乐观并发模型方法: Get,Put,...
  • 悲观并发型号: GetAndLock,PutAndLock,Unlock

如果您使用乐观并发模型方法,Get那么您必须准备好DataCacheErrorCode.RetryLater适当地获取和处理 - 我还使用重试方法.

您可以在MSDN上找到更多信息:并发模型