Memcache服务已关闭 - 如何处理?

时间:2009-11-05 18:21:26

标签: .net memcached

我在ASP.NET应用程序中使用Memcache。我有3个连接到的memcache服务器。如果所有这些都关闭,则加载页面会有很大的延迟。当所有服务器都关闭时,我不想使用memcache。

当我单步执行代码时,我注意到当服务器关闭时,memcache代码不会抛出异常(我以为我可以在我的应用程序中“捕获”它并采取必要的步骤)。

我将如何处理这种情况?

3 个答案:

答案 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观察它们。

相关问题