Domanda

Anche se questa questione è aggiunto EventMachine, generiche soluzioni BSD socket in qualsiasi lingua sono molto apprezzate anche.


Alcuni retroscena:

Ho un'applicazione in ascolto su un socket TCP. Si è avviato e chiuso con uno script di regolare System V init stile.

Il mio problema è che ha bisogno di tempo per l'avvio prima che sia pronto al servizio del socket TCP. Non è troppo lungo, forse solo 5 secondi, ma questo è di 5 secondi troppo lungo quando un riavvio deve essere eseguita nel corso di una giornata lavorativa. E 'anche fondamentale che le connessioni esistenti rimangono aperte e sono finiti in genere.

Le ragioni per un riavvio dell'applicazione sono patch, aggiornamenti, e simili. Io purtroppo mi trovo nella posizione che, di tanto in tanto, ho bisogno di fare questo genere di cose in produzione.


La domanda:

Sto cercando un modo per fare un accurato passaggio di consegne della presa di ascolto TCP, da un processo all'altro, e di conseguenza ottenere solo una frazione di secondo di inattività. Mi piacerebbe connessioni / prese esistenti di rimanere aperti e terminare l'elaborazione nel vecchio processo, mentre il nuovo processo inizia nel servicing di nuovi connectinos.

C'è qualche metodo collaudato di fare questo usando BSD-socket? (punti di bonus per una soluzione EventMachine).

Ci sono forse librerie open-source là fuori di attuazione del presente, che posso usare come è, o usare come riferimento? (Di nuovo, soluzioni non rubino e non EventMachine sono apprezzati anche!)

È stato utile?

Soluzione

Ci sono un paio di modi per farlo senza tempi di inattività, con opportune modifiche al programma server.

Una è quella di implementare una funzionalità di riavvio del server stesso, ad esempio, al ricevimento di un certo segnale o un altro messaggio. Il programma sarebbe poi exec sua nuova versione, passandogli il numero di descrittore di file del socket di ascolto per esempio come argomento. Questa presa avrebbe il FD_CLOEXEC bandiera chiaro (default) così che sarebbe stato ereditato. Poiché le altre prese continueranno ad essere servita dal processo originale e non devono essere trasmessi al nuovo processo, il flag deve essere impostato su quelli esempio utilizzando fcntl() . Dopo un fork e tramite l'esecuzione del nuovo processo, il processo originale può andare avanti e chiudere il socket di ascolto, senza alcuna interruzione del servizio, dal momento che il nuovo processo è ora in ascolto su socket.

Un metodo alternativo, se non si desidera che il vecchio server di dover fork ed exec il nuovo server stesso, sarebbe quella di utilizzare un socket Unix-dominio per comunicare tra il processo di server di vecchio e nuovo. Un nuovo processo server può verificare la presenza di una tale presa in un luogo ben noto nel file system quando si sta iniziando. Se presente, il nuovo server si collegherebbe a questa presa e richiedere che il trasferimento del server vecchia suo socket di ascolto come dati ausiliari utilizzando SCM_RIGHTS. Un esempio di questo è dato a fine cmsg (3) .

Altri suggerimenti

Jean-Paul Calderon ha scritto un prezzi presentazione nel 2004 su una soluzione olistica al problema utilizzando Contorto, compresa la migrazione presa e altre questioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top