Я использую Memcache в своем приложении ASP.NET. У меня есть 3 сервера memcache, к которым он подключается. Если все они не работают, происходит значительная задержка загрузки страниц. Когда все серверы не работают, я бы не хотел использовать memcache.
Когда я просматривал код, я заметил, что когда серверы не работают, код memcache не генерирует исключение (я думал, что могу «поймать» его в своем приложении и предпринять необходимые шаги).
Как бы я справился с этой ситуацией?
РЕДАКТИРОВАТЬ: Подробнее. Мой файл конфигурации выглядит так:
Мы изменили настройку deadTimeOut по умолчанию с 2 минут на 10 секунд, чтобы мертвые серверы были воскрешены как можно скорее (какова оптимальная настройка?). Я подумал о способе реализации этого и хотел запустить его всеми вами. По сути, вот требование:
В настоящее время я использую в своем приложении следующий код:
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, чтобы проверить, жив ли первый сервер или нет. Если это ложь, я могу отправить предупреждение (Соблюдается требование 1). Однако что, если сервер выйдет из строя после получения экземпляра MemcachedClient? Поскольку я использую одноэлементный объект, я не думаю, что смогу позаботиться о варианте использования, в котором сервер отключится после создания экземпляра.
Я не уверен, что делать с 2 и 3.
Мне кажется, что наше требование довольно простое. Поскольку memcache используется компаниями с большими нагрузками, мне интересно, как они заботятся о сценарии отправки предупреждения администратора и предотвращения тайм-аутов TCP.
Любая помощь приветствуется! Спасибо
Поскольку вы не хотите ждать, пока истечет тайм-аут TCP, не могли бы вы развернуть отдельный поток при запуске приложения, который проверяет работоспособность экземпляров hte memcached? Если экземпляр не отвечает, он устанавливает глобальный флаг в экземпляре, который ваш код может проверить перед попыткой вызова memcached?
Это позволяет выполнять проверки асинхронно, а также увеличивать и уменьшать скорость в зависимости от доступности экземпляра.
В memcache нет ничего, чтобы увидеть проблему с подключением, так как вы имеете дело с тайм-аутами tcp. Лучше всего сделать так, чтобы машины могли кражу IP-адресов друг у друга в случае выхода из строя одного устройства.
Собирался порекомендовать то, что только что опубликовал Крис Кинсман. Я бы добавил, что вы также можете использовать отдельный поток для поддержки пула активных подключений к вашим серверам memcache, чтобы вы не использовали ресурсы, постоянно создавая и разрушая подключения. Это имеет тенденцию иметь преимущества при большой нагрузке, а также в целом быть немного более элегантным.