gpt4 book ai didi

c# - AppFabric 无法从重启中恢复

转载 作者:IT王子 更新时间:2023-10-29 03:51:19 27 4
gpt4 key购买 nike

好的,我已经成功部署了 AppFabric,一切都运行良好,直到我们开始在网站上出现间歇性异常:

ErrorCode < ERRCA0017 >:SubStatus < ES0007 >:There is a temporary failure. Please retry later. (The request failed because the server is in throttled state.)

起初我怀疑服务器内存不足(节流状态),但我最终得出结论这不是问题所在。在事件日志中,我发现 DistributedCacheService.exe 时不时崩溃,这让我想到了一种在本地开发环境中重现错误的简单方法:

  • 启动网站,向缓存中添加一些内容。
  • 重新启动“AppFabric 缓存服务”。
  • ...然后我开始收到错误。

如果我在重新启动服务之前执行 Get-CacheClusterHealth,它看起来像这样:

NamedCache = MyCacheName
Healthy = 100,00
UnderReconfiguration = 0,00
NotPrimary = 0,00
NoWriteQuorum = 0,00
Throttled = 0,00

重启后:

Unallocated named cache fractions
---------------------------------

NamedCache = MyCacheName
Unallocated fraction = 100,00

虽然我从 Get-CacheClusterHealth 获得了该结果,但站点失败了。据我所知,它会在一段时间后(10 多分钟)自行纠正。

有什么方法可以让 AppFabric 更快地恢复正常?

最佳答案

简而言之,答案是否定的。

随着您添加额外的节点,集群重启所需的时间会增加,这让我相信这是一个需要时间的节点同步过程。

您看到的异常确实是 appfabric 节点进入节流状态。它将根据您在节点上设置高/低水位线的方式进入节流状态。我认为默认情况下,高水位标记为 90%,此后它将根据缓存中设置的逐出策略开始逐出项目。您通常应该使用 LRU(最近最少使用),但如果缓存仍然无法在设置的限制内运行,它会 self 调节,以免让您的服务器宕机。

如果您的应用程序能够优雅地处理此类事件,它将受益匪浅。如果您的应用程序的集群配置中列出了所有节点,那么您的应用程序应该在下一次尝试获取数据时移动到下一个节点。我们使用重试循环查找临时故障并重试 3 次。如果 3 次后错误仍然存​​在,我们将记录并返回 null,而不是异常。这允许应用程序尝试访问不同的节点或允许问题节点时间恢复:

 private object WithRetry(Func<object> method)
{
int tryCount = 0;
bool done = false;
object result = null;
do
{
try
{
result = method();
done = true;
}
catch (DataCacheException ex)
{
if (ex.ErrorCode == DataCacheErrorCode.KeyDoesNotExist)
{
done = true;
}
else if ((ex.ErrorCode == DataCacheErrorCode.Timeout ||
ex.ErrorCode == DataCacheErrorCode.RetryLater ||
ex.ErrorCode == DataCacheErrorCode.ConnectionTerminated)
&& tryCount < MaxTryCount)
{
tryCount++;
LogRetryException(ex, tryCount);
}
else
{
LogException(ex);
done = true;
}
}
}
while (!done);


return result;
}

这使我们能够执行以下操作:

private void AF_Put(string key, object value)
{
WithRetry(() => defaultCache.Put(key, value));
}

或:

private object AF_Get(string key)
{
return WithRetry(() => defaultCache.Get(key));
}

关于c# - AppFabric 无法从重启中恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7483498/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com