持続性を使用する適度なサイズのアプリケーションがあり、次のバージョンのサーバー用にイベントData.Acid
の 1 つの実装を更新する必要がある状況に遭遇しました。Update
つまり、私は次のようなものを持っています
myUpdate :: Update MyState ()
myUpdate = <some outdated implementation>
さて、明らかに、トランザクション履歴が破損するため、実装を無計画に変更することはできません。そのため、人々は通常これをどのように処理するのか疑問に思っていました. 私の見方では、私のオプションは次のとおりです。
サーバーを停止します。
createCheckpoint
私ののために実行しますAcidState
。Event
実装を更新してから、サーバーを再起動してください。新しいスナップショットからロードするため、変更Update
が古いイベントに対してトリガーされることはありません。Update
新しい名前 ( など) でaa new を作成しmyUpdate_v2
、サーバー ロジックを更新してmyUpdate_v2
、元の の代わりにどこでも使用するようにしmyUpdate
ます。
どちらの選択肢にもメリットがあると思います。(1) は、コードベースに古い機能を保持する必要がないため、より優れていますが、更新するサーバーごとに非常に慎重に行う必要があります。そうしないと、データが破損する危険があります。(2) の方が安全ですが (特にモジュールのエクスポートから古いものを削除すると、myUpdate
誤って古い実装をどこでも使用しないようにすることができます)、それ以外の場合は少し見苦しく感じます。
これを行うためのより良い方法はありますか?これは、長期にわたるプロジェクトで必ず何度も遭遇するものだと考えているため、イベントの実装に変更を適用するための優れた標準的なワークフローが必要です。