У меня есть несколько серверов кеширования, которые добавляются в виртуальный пул на уровне PHP через api Memcached :: addServers (). Во время тестирования отказоустойчивости я заметил, что отключение одного из серверов memcached привело к увеличению времени отклика приложения до 3-6 секунд на запрос, тогда как обычно они занимают 0,5-2 секунды на запрос.
Я реализовал эти настройки по совету этого Сообщение блога:
$memcached = new Memcached();
$memcached->setOption(Memcached::OPT_CONNECT_TIMEOUT, 10);
$memcached->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$memcached->setOption(Memcached::OPT_REMOVE_FAILED_SERVERS, true);
$memcached->setOption(Memcached::OPT_RETRY_TIMEOUT, 1);
$memcached->addServers($servers);
Однако эти настройки не помогли решить проблему увеличенного запаздывания. Единственный способ решить проблему - повторно ввести сервер в пул, после чего задержка исчезнет. Очевидно, что это не идеальное решение, так как нам может потребоваться 15 минут, чтобы решить проблему в производственной среде (то есть ужасная страница в 3 часа ночи).
Исследуя эту проблему, я наткнулся на Почта, в котором обсуждается использование moxi, и звучит интересно, но прежде чем я перейду к введению еще одного уровня в наше приложение, я хотел бы знать, как другие решают эти проблемы с задержкой?
Я закончил установку twemproxy (Прокси-сервер Memcached от Twitter), так как он автоматически удаляет хосты, которые не отвечают. Этот api решил мои проблемы с задержкой.