2012-07-26 8 views
6

Sto pensando di scrivere un'app Web in clojure che può aggiornarsi senza riavviare o perdere lo stato.Web-app con clojure utilizzando hot-swapping del codice

Ho visto alcuni articoli in cui le app Clojure possono eseguire il cosiddetto hot-swapping del codice. Significa che possono aggiornare le proprie funzioni in fase di runtime. Questo è sicuro da eseguire su un server web?

+2

Definire "* safe *" nell'ultima frase. – dimagog

+0

Lo stesso di [Meteor] (http://meteor.com). Sarebbe carino. –

+0

@dimagog senza il crash del server, e senza che gli utenti debbano riconnettersi, e senza perdere o corrompere lo stato ... mi rendo conto che questo è impossibile se si modificano le librerie di terze parti o la reale manipolazione TCP (o http). Molto spesso, tuttavia, si apportano modifiche all'applicazione effettiva e sarebbe utile correggere bug senza un effettivo riavvio del server. –

risposta

6

Per ottenere hot-swap per il codice è complicato avere ragione, se possibile. Dipende anche dal changeset e dall'applicazione in esecuzione.

Issues:

  • vecchi Vars possono namespace lettiera e causare conflitti sottili, insetti
  • ridefinizione di molteplici Vars non è atomica

Ci possono essere vecchi Vars in uno spazio dei nomi che non sarà lì se si riavvia l'applicazione, tuttavia interferirà se si ridefiniscono alcune funzioni e si mantiene l'app in esecuzione senza riavvio.

L'altro problema è l'atomicità: ridefinizione di più funzioni, ovvero la modifica di più vars non è atomica. Se si cambiano le funzioni in uno o più namespace da cui dipende il codice in qualche altro spazio dei nomi, il ricaricamento degli spazi dei nomi con il nuovo codice non è atomico.

In generale, si sta meglio sia

  1. avere un proxy tenere le richieste fino a quando la vostra applicazione si riavvia
  2. girare una nuova istanza applicazione parallela alla "vecchia versione" e utilizzare un proxy per passare da la nuova versione dopo la nuova versione è pronta per elaborare le richieste
4

Le applicazioni OTP in Erlang supportano questo. Fondamentalmente, girerà la nuova versione della tua applicazione e inizierà a inviare richieste alla nuova versione della tua applicazione. Manterrà viva la vecchia versione fino a quando non avrà completato le richieste di elaborazione e quindi lo spegnerà.

+0

OTP? +1 per informazioni interessanti. –