场景:
编写了一个后端服务,该服务会定期检查数据库中的新行并将其插入 AppFabric 缓存中。自从两个多月以来,我们一直在使用这种方法。
我们正在使用服务器机器将数据存储到不同区域的缓存中。我们没有使用任何机器集群。它只有一台机器。“默认”缓存区域已分为 3 个区域,用于 3 个不同的环境。每个环境都从其指定的缓存区域访问此机器以获取缓存数据。
它工作正常,直到几天后发生以下情况。我们得到以下异常。
错误代码:ERRCA0016:SubStatus ES0001:连接已终止,可能是由于服务器或网络问题或序列化对象大小大于服务器上的 MaxBufferSize。请求的结果未知。
随后对缓存的访问会引发以下异常: ErrorCode ERRCA0017 : SubStatus ES0001:存在临时故障。请稍后重试。
经过 4 到 5 次尝试,我们得到以下异常。 ErrorCode ERRCA0018:SubStatus ES0001:请求超时。
毕竟,访问缓存会引发以下异常: ErrorCode ERRCA0005 : SubStatus ES0001 :所指区域不存在。使用 CreateRegion API 修复错误。
查看第一个错误 ErrorCode: ERRCA0016 :SubStatus ES0001 : 检查要存储的序列化对象的大小是否大于最大缓冲区大小。但在此之前,这个较大尺寸的对象被保存到缓存中。似乎这不是问题。
可能发生的确切问题是什么?
已编辑:确实查看了 Windows AppFabirc 缓存的事件记录器日志。这是我们在挖掘中发现的。这些是获得的一些常见错误日志。
来源: AppFabricCachingService.Failfast
参数:外部存储的租约已过期:Microsoft.Fabric.Federation.ExternalRingStateStoreException:租约已在 Microsoft.Fabric.Data.ExternalStoreAuthority.UpdateNode(NodeInfo nodeInfo, TimeSpan timeout) 在 Microsoft.Fabric.Federation.SiteNode.PerformExternalRingStateStoreOperations(Boolean& canFormRing, Boolean isInsert, Boolean isJoining) 一般:AppFabric 缓存服务崩溃。外部存储的租约已过期:Microsoft.Fabric.Federation.ExternalRingStateStoreException:租约已在 Microsoft.Fabric.Federation.SiteNode.PerformExternalRingStateStoreOperations(Boolean& canFormRing, Boolean isInsert) 的 Microsoft.Fabric.Data.ExternalStoreAuthority.UpdateNode(NodeInfo nodeInfo, TimeSpan timeout) 过期, Boolean isJoining)}
来源: AppFabricCachingService.Crash
参数:
System.Runtime.CallbackException:异步回调引发异常。---> System.IdentityModel.Tokens.SecurityTokenValidationException:该服务不允许您匿名登录。在 ......
可能的原因
在搜索上述事件日志错误后,发现这可能是由于以下问题引起的。缓存服务器是不同的服务器,并且 SQL 配置用于同一台服务器,其数据库位于不同的服务器上。因此,在从 SQL 数据库获取缓存配置时,在缓存服务器和数据库服务器之间创建连接时会出现一些故障。因此,我们将缓存配置从 SQL 移至 XML。但我们仍然得到了错误。
错误代码 ERRCA0017:子状态 ES0001:出现临时故障。请稍后重试。
错误代码 ERRCA0005:子状态 ES0001:引用的区域不存在。使用 CreateRegion API 修复错误。
经过更多的挖掘,我们猜测问题可能出在这上面。每当没有授予访问权限的机器访问 AppFabric 缓存时,它就会尝试一些尝试次数,然后 appfabric 停止工作。使用 Grant powershell 命令授予对缓存的访问权限后,机器现在可以访问缓存。还要观察几天。
这是一个正当的理由吗?