Как обрабатывать изменение реализации событий при использовании Data.Acid

У меня есть приложение с умеренным размером, которое использует Data.Acid для сохранения, и я столкнулся с ситуацией, когда мне нужно обновить реализацию одного из моих событий Update для следующей версии сервера. То есть У меня есть что-то вроде

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

Теперь, очевидно, я не могу просто изменить реализацию случайным образом, так как это испортило бы мою историю транзакций, поэтому мне было интересно, как люди обычно справляются с этим. Как я вижу, мои варианты:

  • Остановить сервер. Запустите createCheckpoint для моего AcidState. Обновите реализацию Event и перезапустите сервер. Поскольку мы загружаем новый световой снимок, измененный Update никогда не должен запускаться для старых событий.

  • Создайте новый Update с новым именем (например, myUpdate_v2) и обновите мою логику сервера, чтобы использовать myUpdate_v2 везде вместо исходного myUpdate.

Я думаю, что оба варианта имеют свои достоинства. (1) лучше, поскольку мне не нужно сохранять старые функции в моей кодовой базе, но это нужно делать очень тщательно для каждого обновляемого сервера, или я рискую развратить данные. (2) безопаснее (особенно если я удаляю старый myUpdate из моего экспорта модулей, поэтому я могу быть уверен, что я случайно не использую старую реализацию в любом месте), но он чувствует себя немного уродливым в противном случае.

Есть ли лучший способ сделать это? Я вижу это как то, что я обязательно буду сталкиваться каждый раз и снова в долгоживущем проекте, поэтому я хотел бы иметь хороший стандартный рабочий процесс для внесения изменений в реализацию моих событий.

Ответ 1

Решение состоит в том, чтобы не использовать функции более высокого порядка, такие как "alter". Преимущества кислотного состояния (гарантии ACID, запуск кода удаленно и т.д.) Происходит за счет использования только сериализуемых данных. Эта ограничение вряд ли когда-либо будет отменено.

Обычно это не большая проблема; Просто специализируйте свой код. Если это не режет, возможно, вы хотите сохранить свое состояние в MVar.