在测试我们全新的主系统原型时,我遇到了与AppFabric Cache同时发生的问题。当同时使用许多DataCache.Get()和Put()来调用相同的cacheKey时,我试图存储相对较大的对象,我会收到“ErrorCode:SubStatus:There is a temporary failure. Please retry later.”的错误提示。这可以通过以下代码重现:
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();
}
当使用不同的键调用Get()函数或DataCache进行同步时,这个问题就不会出现。如果每次从DataCacheFactory获取DataCache(DataCache应该是线程安全的)或超时时间被延长,则没有影响,仍然会收到错误信息。
我觉得微软会留下这样的bug非常奇怪。有人遇到过类似的问题吗?