У меня есть приложение с умеренным размером, которое использует Data.Acid
для сохранения, и я столкнулся с ситуацией, когда мне нужно обновить реализацию одного из моих событий Update
для следующей версии сервера. То есть У меня есть что-то вроде
myUpdate :: Update MyState ()
myUpdate = <some outdated implementation>
Теперь, очевидно, я не могу просто изменить реализацию случайным образом, так как это испортило бы мою историю транзакций, поэтому мне было интересно, как люди обычно справляются с этим. Как я вижу, мои варианты:
-
Остановить сервер. Запустите
createCheckpoint
для моегоAcidState
. Обновите реализациюEvent
и перезапустите сервер. Поскольку мы загружаем новый световой снимок, измененныйUpdate
никогда не должен запускаться для старых событий. -
Создайте новый
Update
с новым именем (например,myUpdate_v2
) и обновите мою логику сервера, чтобы использоватьmyUpdate_v2
везде вместо исходногоmyUpdate
.
Я думаю, что оба варианта имеют свои достоинства. (1) лучше, поскольку мне не нужно сохранять старые функции в моей кодовой базе, но это нужно делать очень тщательно для каждого обновляемого сервера, или я рискую развратить данные. (2) безопаснее (особенно если я удаляю старый myUpdate
из моего экспорта модулей, поэтому я могу быть уверен, что я случайно не использую старую реализацию в любом месте), но он чувствует себя немного уродливым в противном случае.
Есть ли лучший способ сделать это? Я вижу это как то, что я обязательно буду сталкиваться каждый раз и снова в долгоживущем проекте, поэтому я хотел бы иметь хороший стандартный рабочий процесс для внесения изменений в реализацию моих событий.