Por fim, tenho uma solução em funcionamento e compartilho com outras pessoas, caso elas encontrem o mesmo sitch. A base para a minha solução veio desse post , assim que eu vi o $testInstance
e $realInstance
me ocorreu, use a instância de teste para determinar quais servidores estão disponíveis, então adicione bons servidores conhecidos ao real instância. Você pode estar se perguntando, por que não chamar apenas addServers
duas vezes na mesma instância, a resposta? Você não pode.
Se você tentar chamar addServers
mais de uma vez na mesma instância, verá um comportamento inesperado; para mim, foi um gateway incorreto devido a: "conexão encerrada antecipadamente fechada durante a leitura do cabeçalho de resposta do upstream". Então, houve algum mecanismo interno fazendo com que o PHP falhasse, embora eu não saiba por que especificamente, já que nenhum erro apareceu no log de erros.
Em vez de fazer chamadas de conexão explícitas como o autor fez, optei por usar a chamada getStats()
disponível e verificar se há um pid.
Fragmento de trabalho:
$cacheReal = new Memcached;
$cacheTest = new Memcached;
if (count($cacheTest->getServerList()) < 1) {
$knownGoodServers = array();
$serversToAdd = array();
foreach ($servers as $server) {
$serversToAdd[] = array($server, $port);
}
$cacheTest->addServers($serversToAdd);
foreach ($cacheTest->getStats() as $server => $stats) {
// Test if server is actually available
if ((false === Hobis_Api_Array_Package::populatedKey('pid', $stats)) ||
($stats['pid'] < 0)) {
continue;
}
$knownGoodServers[] = $server;
}
// It is possible that entire cache pool took a dump
if (true === Hobis_Api_Array_Package::populated($knownGoodServers)) {
$serversToAdd = array();
foreach ($knownGoodServers as $server) {
list($host, $port) = array_map('trim', explode(':', $server));
$serversToAdd[] = array($host, (int) $port);
}
if (true === Hobis_Api_Array_Package::populated($serversToAdd)) {
$cacheReal->addServers($serversToAdd);
}
}
}
No meu teste, eu tinha vários nós de cache que estavam todos em execução para o teste 1 e, em testes subsequentes, eu desliguei alguns nós de cache e, finalmente, desliguei todos (para testar a degradação). A única diferença notável foi que, depois de desativar um nó ou adicionar um nó (por meio do reinício do daemon), minha sessão conectada seria desconectada, o que faz sentido, pois os dados armazenados em cache não estão mais disponíveis no servidor esperado. No entanto, as solicitações subseqüentes após o logon no comportamento esperado demonstrado durante o login, porque os dados da sessão foram gravados em nós de cache disponíveis no momento da solicitação.