我在ASP.NET应用程序中使用Memcache。我有3个连接到的memcache服务器。如果所有这些都关闭,则加载页面会有很大的延迟。当所有服务器都关闭时,我不想使用memcache。
当我单步执行代码时,我注意到当服务器关闭时,memcache代码不会抛出异常(我以为我可以在我的应用程序中“捕获”它并采取必要的步骤)。
我将如何处理这种情况?
答案 0 :(得分:2)
您在这里尝试做的并不是您的应用程序的工作。
我们假设您的缓存界面是这样的。
public class CacheManager
{
protected ICacheProvider _repository;
public CacheManager(ICacheProvider repository)
{
_repository = repository;
}
public void Store(string key, object data)
{
_repository.Store(key, data);
}
public void Destroy(string key)
{
_repository.Destroy(key);
}
public T Get<T>(string key)
{
return _repository.Get<T>(key);
}
}
如果是这种情况,如果所有内存缓存服务器都关闭,您有什么选择?您只能通过访问db / filessystem / etc继续正常工作。毕竟,按定义缓存是不可靠的。
假设您的memcached在* nix服务器上运行,您应该考虑从网络或操作系统级别监控它的方法。 Memcached有一个wiki page for this。编写规则/脚本来解析并通知您的管理员并将其启动。您最简单的选择是使用munin恕我直言
答案 1 :(得分:1)
由于Enyim是开源的,您可以编辑ServerPool.cs,如下所示:
/// <summary>
/// Marks a node as dead (unusable)
/// - moves hte node to the "dead list"
/// - recreates the locator based on the new list of still functioning servers
/// </summary>
/// <param name="node"></param>
private void MarkAsDead(MemcachedNode node)
{
this.serverAccessLock.UpgradeToWriterLock(Timeout.Infinite);
try
{
// server gained AoeREZ while AFK?
if (!node.IsAlive)
{
this.workingServers.Remove(node);
this.deadServers.Add(node);
// check if all servers are dead
if (this.workingServers.Count == 0)
throw new NoMoreServersException();
this.RebuildIndexes();
}
}
finally
{
this.serverAccessLock.ReleaseLock();
}
}
我没有测试过上面的代码。顺便说一句,我的改变是这三行:
// check if all servers are dead
if (this.workingServers.Count == 0)
throw new NoMoreServersException();
您还应该创建NoMoreServersException
(或使用一般异常(尽管不建议))。
答案 2 :(得分:0)
如何检查服务是否已关闭?有几种方法:
所以,只需采取一些措施,不要让所有的memcached失效。例如,用monit观察它们。