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