Princípio de reinicialização suave
O que é uma reinicialização suave?
A reinicialização suave difere de uma reinicialização normal, pois permite reiniciar o serviço (geralmente referindo-se a negócios de conexão curta) sem impacto aos usuários, a fim de recarregar o programa PHP e concluir a atualização do código empresarial.
A reinicialização suave é normalmente aplicada durante a atualização do negócio ou durante o processo de lançamento da versão, e pode evitar os impactos temporários de indisponibilidade do serviço causados por reinicializações de serviço devido a atualizações de código.
Nota
O sistema Windows não suporta recarga.Nota
Para negócios de conexão longa (por exemplo, WebSocket), as conexões serão desconectadas durante a reinicialização do processo. A solução é usar uma arquitetura semelhante à gatewayWorker, onde um grupo de processos é dedicado à manutenção da conexão e a propriedade reloadable desse grupo de processos é definida como falso. A lógica empresarial é iniciada por outro grupo de processos de trabalhadores, e a comunicação entre o gateway e os processos de trabalhadores é realizada por meio de TCP. Quando houver necessidade de alterações no negócio, basta reiniciar os processos de trabalhadores.
Limitações
Nota: Somente os arquivos carregados em callbacks on{...} serão atualizados após uma reinicialização suave; arquivos carregados diretamente no script de inicialização ou código fixo não serão atualizados.
O seguinte código não será atualizado após uma recarga
$worker = new Worker('http://0.0.0.0:1234');
$worker->onMessage = function($connection, $request) {
$connection->send('hi'); // O código fixo não é suportado para atualização
};
$worker = new Worker('http://0.0.0.0:1234');
require_once __DIR__ . '/seu/caminho/MessageHandler.php'; // Os arquivos carregados diretamente no script de inicialização não suportam atualizações
$messageHandler = new MessageHandler();
$worker->onMessage = [$messageHandler, 'onMessage']; // Supondo que a classe MessageHandler tenha um método onMessage
O seguinte código será atualizado após uma recarga
$worker = new Worker('http://0.0.0.0:1234');
$worker->onWorkerStart = function($worker) { // onWorkerStart é o callback acionado após o lançamento do processo
require_once __DIR__ . '/seu/caminho/MessageHandler.php'; // Os arquivos carregados após a inicialização do processo suportam atualizações
$messageHandler = new MessageHandler();
$worker->onMessage = [$messageHandler, 'onMessage'];
};
Após uma alteração no MessageHandler.php, executando php start.php reload
, o MessageHandler.php será recarregado na memória para atualizar a lógica empresarial.
Dica
O código acima utiliza a declaraçãorequire_once
para fins de demonstração, mas se o seu projeto suportar o carregamento automático por PSR-4, a declaraçãorequire_once
não é necessária.
Princípio de reinicialização suave
O Workerman consiste em um processo principal e processos secundários. O processo principal monitora os processos secundários, que são responsáveis por receber conexões de clientes e processar dados recebidos dos clientes, realizando o devido processamento e retornando os dados aos clientes. Ao atualizar o código empresarial, apenas precisamos atualizar os processos secundários para alcançar o objetivo da atualização do código.
Quando o processo principal do Workerman recebe um sinal de reinicialização suave, ele envia um sinal de encerramento seguro (permitindo que o processo em questão complete o processamento da solicitação atual antes de sair) para um dos processos secundários. Após a saída deste processo, o processo principal cria um novo processo secundário (carregando o novo código PHP), e então o processo principal envia o comando de parar para outro processo antigo, reiniciando assim um processo de cada vez, até que todos os processos antigos sejam substituídos.
Vemos que a reinicialização suave, na verdade, faz com que os processos de negócios antigos saiam um por um e crie novos processos para substituí-los. Para garantir que os usuários não sejam afetados durante a reinicialização suave, é necessário garantir que os processos não mantenham informações de estado relacionadas aos usuários, ou seja, é preferível que os processos de negócios sejam sem estado, evitando a perda de informações devido à saída dos processos.