我在 ASP.NET 应用程序中使用 Memcache。它连接到 3 个 memcache 服务器。如果所有服务器都宕机,则加载页面会明显延迟。当所有服务器都宕机时,我不想使用 memcache。
当我逐步执行代码时,我注意到当服务器关闭时,memcache 代码不会引发异常(我认为我可以在我的应用程序中“捕获”它并采取必要的步骤)。
我该如何处理这种情况?
编辑:更多详细信息。我的配置文件如下所示:
我们已将 deadTimeOut 的默认设置从 2 分钟更改为 10 秒,以便尽快恢复死机服务器(最佳设置是什么?)。我想到了实现此方法的方法,并希望与大家一起运行。基本上,要求如下:
- 如果服务器瘫痪——提醒管理员
- 关闭每 10 秒检查一次服务器是否启动的计时器 (isAliveTimer)
- 如果任何服务器宕机,请勿使用 memcache。我的理解是,如果 2 个服务器中有 1 个宕机,我们仍然会遇到计时器检查宕机服务器是否正常运行的问题,这会导致响应时间变长。
我目前在我的应用程序中使用以下代码:
private class Singleton
{
private static MemcachedClient instance;
protected Singleton()
{
}
public static MemcachedClient Instance()
{
if (instance == null)
{
instance = new MemcachedClient();
}
return instance;
}
}
要创建实例,我执行以下操作:
MemcachedClient mc = Singleton.Instance();
我可以查看 mc.pool.WorkingServers.Items[0].IsAlive 来检查第一个服务器是否处于活动状态。如果为 false,我可以发送警报(满足要求 1)。但是,如果在获取 MemcachedClient 实例后服务器发生故障怎么办?由于我使用单例对象,我认为我无法处理在创建实例后服务器发生故障的用例。
我不确定该如何处理 2 和 3。
我觉得我们的需求比较简单,因为memcache是负载较大的公司使用的,不知道他们如何处理发送管理警报和防止TCP超时的情况。
任何帮助都非常感谢!谢谢
答案1
基本上是要推荐 Chris Kinsman 刚刚发布的内容。我想补充一点,您还可以使用单独的线程来维护到您的 memcache 服务器的活动连接池,这样您就不会因为不断创建和销毁连接而耗尽资源。这在重负载下往往具有优势,而且通常更优雅一些。
答案2
由于您正在处理 tcp 超时,因此 memcache 中没有任何东西可以查看连接问题。最好的办法是让机器能够相互窃取 IP,以防单个设备发生故障。
答案3
由于您不想等待 TCP 超时,您可以在应用程序启动时启动一个单独的线程来检查 memcached 实例的运行状况吗?如果实例没有响应,它会在实例中设置一个全局标志,您的代码可以在尝试调用 memcached 之前检查该标志?
这使得您可以以异步方式进行检查,并根据实例可用性进行调节。