58

我有一个用于持久性的中等大小的应用程序,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的,所以我可以确定我不会在任何地方不小心使用旧的实现),但否则感觉有点难看。

有没有更好的方法来做到这一点?我认为这是我在一个长期项目中肯定会不时遇到的事情,所以我希望有一个好的、标准的工作流程来将更改应用于我的事件的实现。

4

1 回答 1

1

解决方案是不使用像“alter”这样的高阶函数。酸性状态(ACID 保证、远程运行代码等)的好处是以仅使用可序列化数据为代价的。这一限制不太可能被解除。

通常这不是一个大问题;只需专门化您的代码。如果这不能削减它,也许你想将你的状态保持在一个 MVar 中。

于 2015-09-02T10:20:05.017 回答