Principio di Riavvio Graduale

Cos'è il Riavvio Graduale?

Il riavvio graduale è diverso da un normale riavvio; consente di riavviare il servizio (solitamente riferito a servizi a connessione breve) senza interrompere gli utenti, per ricaricare i programmi PHP e completare l'aggiornamento del codice aziendale.

Il riavvio graduale è generalmente applicato durante l'aggiornamento dell'attività o il rilascio di versioni, evitando l'impatto della temporanea indisponibilità del servizio a causa del riavvio durante la pubblicazione del codice.

Attenzione
Il sistema Windows non supporta il reload.

Attenzione
Per i servizi a connessione lunga (come websocket), durante il riavvio graduale del processo, le connessioni verranno interrotte. La soluzione è utilizzare un'architettura simile a gatewayWorker, dove un insieme di processi è dedicato a mantenere le connessioni e la proprietà reloadable di questo insieme di processi è impostata su false. La logica aziendale avvia un altro insieme di processi worker per gestire, mentre il gateway e i processi worker comunicano tra loro tramite TCP. Quando è necessario modificare l'attività, basta riavviare il processo worker.

Limitazioni

Attenzione: solo i file caricati nel callback on{...} verranno aggiornati automaticamente dopo un riavvio graduale; i file caricati direttamente nello script di avvio o il codice hardcoded non verranno automaticamente aggiornati eseguendo il reload.

Il codice seguente non verrà aggiornato dopo il reload

$worker = new Worker('http://0.0.0.0:1234');
$worker->onMessage = function($connection, $request) {
    $connection->send('hi'); // Codice hardcoded non supporta l'aggiornamento a caldo
};
$worker = new Worker('http://0.0.0.0:1234');
require_once __DIR__ . '/your/path/MessageHandler.php'; // File caricati direttamente nello script di avvio non supportano l'aggiornamento a caldo
$messageHandler = new MessageHandler();
$worker->onMessage = [$messageHandler, 'onMessage']; // Supponiamo che la classe MessageHandler abbia un metodo onMessage

Il codice seguente verrà aggiornato automaticamente dopo il reload

$worker = new Worker('http://0.0.0.0:1234');
$worker->onWorkerStart = function($worker) { // onWorkerStart è il callback attivato dopo l'avvio del processo
    require_once __DIR__ . '/your/path/MessageHandler.php'; // File caricati dopo l'avvio del processo supportano l'aggiornamento a caldo
    $messageHandler = new MessageHandler();
    $worker->onMessage = [$messageHandler, 'onMessage'];
};

Dopo aver modificato MessageHandler.php, esegui php start.php reload, MessageHandler.php verrà ricaricato in memoria per aggiornare la logica aziendale.

Suggerimento
Il codice precedente utilizza require_once per facilità di dimostrazione. Se il tuo progetto supporta il caricamento automatico psr4, non è necessario chiamare l'istruzione require_once.

Principio di Riavvio Graduale

Workerman è composto da un processo principale e processi secondari; il processo principale è responsabile della supervisione dei processi secondari, mentre i processi secondari si occupano di ricevere le connessioni dei client e i dati delle richieste inviate, gestendoli e restituendo i dati ai client. Quando il codice aziendale viene aggiornato, in realtà dobbiamo solo aggiornare i processi secondari per ottenere l'aggiornamento del codice.

Quando il processo principale di Workerman riceve un segnale di riavvio graduale, esso invierà un segnale di uscita sicura (che consente al processo interessato di completare la richiesta corrente prima di uscire) a uno dei processi secondari. Quando questo processo esce, il processo principale creerà un nuovo processo secondario (questo nuovo processo carica il nuovo codice PHP), quindi il processo principale invierà nuovamente un comando di arresto a un altro processo vecchio, continuando a riavviare un processo alla volta fino a quando tutti i vecchi processi sono stati sostituiti.

Possiamo osservare che il riavvio graduale in realtà consiste nel far uscire progressivamente i vecchi processi di attività e nel creare nuovi processi uno alla volta. Per garantire che non ci siano interruzioni per gli utenti durante il riavvio graduale, è necessario evitare di memorizzare informazioni di stato relative all'utente nei processi; cioè, i processi aziendali dovrebbero idealmente essere senza stato, per evitare la perdita di informazioni a causa dell'uscita del processo.