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

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

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

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

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

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

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

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

1 ответ

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

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

Другие вопросы по тегам