2012-07-26 9 views
6

Estoy pensando en escribir una aplicación web en clojure que pueda actualizarse sin reiniciar o perder el estado.Aplicación web con clojure usando el intercambio en caliente del código

He visto algunos artículos donde las aplicaciones Clojure pueden realizar el llamado intercambio en caliente de código. Lo que significa que pueden actualizar sus propias funciones en tiempo de ejecución. ¿Sería seguro realizar esto en un servidor web?

+2

Define "* safe *" en tu última frase. – dimagog

+0

De la misma manera que [Meteor] (http://meteor.com) sí. Eso estaría bien. –

+0

@dimagog sin que el servidor se cuelgue, y sin que los usuarios tengan que volver a conectarse, y sin perder o dañar el estado ... Me doy cuenta de que esto es imposible si se cambian las bibliotecas de terceros o el manejo de TCP (o http). Sin embargo, en la mayoría de los casos, usted hace cambios en la aplicación real, y sería bueno solucionar los errores sin un reinicio real del servidor. –

Respuesta

6

Para obtener intercambio en caliente para el código es complicado hacerlo bien, si es posible. Depende también del conjunto de cambios y de la aplicación en ejecución.

Problemas:

  • viejos VARs pueden espacios de nombres de basura y causan conflictos sutiles, insectos
  • redefinición de múltiples VARs no es atómica

Puede haber viejos VARs en un espacio de nombres que no será allí si reinicias la aplicación, sin embargo interferirá si solo redefines algunas de las funciones y mantienes la aplicación ejecutándose sin reiniciar.

El otro problema es la atomicidad: la redefinición de funciones múltiples, es decir, el cambio de varios vars no es atómico. Si cambia las funciones en uno o más espacios de nombres de los que depende el código en algún otro espacio de nombres, volver a cargar los espacios de nombres con el nuevo código no es atómico.

En general, es mejor ya sea

  1. tener un poder sostener las solicitudes hasta que su aplicación se reinicia
  2. girar hasta una nueva instancia aplicación paralela a la "versión antigua" y utilizar un proxy para cambiar de la nueva versión después de que la nueva versión esté lista para procesar solicitudes
4

Las aplicaciones OTP en Erlang lo admiten. Básicamente, girará la nueva versión de su aplicación y comenzará a enviar solicitudes a la nueva versión de su aplicación. Mantendrá viva la versión anterior hasta que haya completado las solicitudes de procesamiento y luego la cierre.

+0

OTP? +1 para obtener información interesante. –

Cuestiones relacionadas