Назад | Перейти на главную страницу

Сервис Memcache не работает - что делать?

Я использую Memcache в своем приложении ASP.NET. У меня есть 3 сервера memcache, к которым он подключается. Если все они не работают, происходит значительная задержка загрузки страниц. Когда все серверы не работают, я бы не хотел использовать memcache.

Когда я просматривал код, я заметил, что когда серверы не работают, код memcache не генерирует исключение (я думал, что могу «поймать» его в своем приложении и предпринять необходимые шаги).

Как бы я справился с этой ситуацией?

РЕДАКТИРОВАТЬ: Подробнее. Мой файл конфигурации выглядит так:

Мы изменили настройку deadTimeOut по умолчанию с 2 минут на 10 секунд, чтобы мертвые серверы были воскрешены как можно скорее (какова оптимальная настройка?). Я подумал о способе реализации этого и хотел запустить его всеми вами. По сути, вот требование:

  1. Если сервер выходит из строя - предупредить админа
  2. Выключите таймер (isAliveTimer), который проверяет, включен ли сервер каждые 10 секунд.
  3. Не используйте 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, чтобы проверить, жив ли первый сервер или нет. Если это ложь, я могу отправить предупреждение (Соблюдается требование 1). Однако что, если сервер выйдет из строя после получения экземпляра MemcachedClient? Поскольку я использую одноэлементный объект, я не думаю, что смогу позаботиться о варианте использования, в котором сервер отключится после создания экземпляра.

Я не уверен, что делать с 2 и 3.

Мне кажется, что наше требование довольно простое. Поскольку memcache используется компаниями с большими нагрузками, мне интересно, как они заботятся о сценарии отправки предупреждения администратора и предотвращения тайм-аутов TCP.

Любая помощь приветствуется! Спасибо

Поскольку вы не хотите ждать, пока истечет тайм-аут TCP, не могли бы вы развернуть отдельный поток при запуске приложения, который проверяет работоспособность экземпляров hte memcached? Если экземпляр не отвечает, он устанавливает глобальный флаг в экземпляре, который ваш код может проверить перед попыткой вызова memcached?

Это позволяет выполнять проверки асинхронно, а также увеличивать и уменьшать скорость в зависимости от доступности экземпляра.

В memcache нет ничего, чтобы увидеть проблему с подключением, так как вы имеете дело с тайм-аутами tcp. Лучше всего сделать так, чтобы машины могли кражу IP-адресов друг у друга в случае выхода из строя одного устройства.

Собирался порекомендовать то, что только что опубликовал Крис Кинсман. Я бы добавил, что вы также можете использовать отдельный поток для поддержки пула активных подключений к вашим серверам memcache, чтобы вы не использовали ресурсы, постоянно создавая и разрушая подключения. Это имеет тенденцию иметь преимущества при большой нагрузке, а также в целом быть немного более элегантным.