我有一个用于持久性的中等大小的应用程序,Data.Acid
我遇到了一种情况,我需要Update
为下一个版本的服务器更新我的一个事件的实现。即我有类似的东西
myUpdate :: Update MyState ()
myUpdate = <some outdated implementation>
现在,显然我不能随意更改实现,因为它会破坏我的交易历史,所以我想知道人们通常如何处理这个问题。我看到它的方式是:
停止服务器。为
createCheckpoint
我的AcidState
. 更新Event
实现,然后重新启动服务器。由于我们是从新快照加载的,因此更改Update
不应触发旧事件。创建
Update
一个新名称(如myUpdate_v2
)并更新我的服务器逻辑以仅myUpdate_v2
在任何地方使用,而不是原来的myUpdate
.
我认为这两种选择都有其优点。(1) 更好,因为我不需要在我的代码库中保留旧功能,但是对于我更新的每台服务器都必须非常小心地完成,否则我有损坏数据的风险。(2) 更安全(特别是如果我从模块的导出中删除旧myUpdate
的,所以我可以确定我不会在任何地方不小心使用旧的实现),但否则感觉有点难看。
有没有更好的方法来做到这一点?我认为这是我在一个长期项目中肯定会不时遇到的事情,所以我希望有一个好的、标准的工作流程来将更改应用于我的事件的实现。