Как обрабатывать изменение реализации событий при использовании 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.