haskell acid-state

haskell - Cómo manejar el cambio de la implementación de eventos cuando se usa Data.Acid



acid-state (1)

La solución es no usar funciones de orden superior como ''alterar''. Los beneficios del estado ácido (garantías ACID, código ejecutado de forma remota, etc.) se consiguen con el solo uso de datos serializables. Es poco probable que esta restricción se levante alguna vez.

Por lo general, este no es un gran problema; Solo especializa tu código. Si esto no funciona, quizás desee mantener su estado en un MVar.

Tengo una aplicación de tamaño moderado que usa Data.Acid para la persistencia y he encontrado una situación en la que necesito actualizar la implementación de uno de mis eventos de Update para la próxima versión del servidor. Es decir, tengo algo así como

myUpdate :: Update MyState () myUpdate = <some outdated implementation>

Ahora, obviamente, no puedo simplemente cambiar la implementación al azar ya que corrompería mi historial de transacciones, por lo que me preguntaba cómo la gente suele manejar esto. Como yo lo veo, mis opciones son:

  1. Detener el servidor. Ejecute createCheckpoint para mi AcidState . Actualice la implementación del Event y luego reinicie el servidor. Como cargamos desde una instantánea nueva, la Update modificada nunca debe activarse para los eventos anteriores.

  2. Cree una nueva Update con un nuevo nombre (como myUpdate_v2 ) y actualice la lógica de mi servidor para que use myUpdate_v2 todas partes en lugar de myUpdate original.

Creo que ambas opciones tienen sus méritos. (1) es más agradable ya que no necesito retener la funcionalidad anterior en mi base de código, pero tiene que hacerse con mucho cuidado para cada servidor que actualice o corro el riesgo de dañar los datos. (2) es más seguro (especialmente si myUpdate el antiguo myUpdate de las exportaciones de mi módulo para poder estar seguro de que no uso accidentalmente la implementación anterior en cualquier lugar), pero de lo contrario se siente un poco feo.

¿Hay alguna forma mejor de hacer esto? Veo esto como algo que definitivamente encontraré una y otra vez en un proyecto de larga duración, por lo que me gustaría tener un flujo de trabajo bueno y estándar para aplicar cambios a la implementación de mis eventos.