使用Data.Acid时如何处理更改事件的实现

时间:2013-12-19 18:36:02

标签: haskell acid-state

我有一个中等大小的应用程序,使用Data.Acid来保持持久性,我遇到了一种情况,我需要为下一个版本更新我的Update个事件之一的实现服务器。即我有类似

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

现在,显然我不能随便改变实施,因为它会破坏我的交易历史,所以我想知道人们通常如何处理这个问题。我认为我的选择方式是:

  1. 停止服务器。为我的createCheckpoint运行AcidState。更新Event实现,然后重新启动服务器。由于我们从新快照加载,因此更改的Update永远不会触发旧事件。

  2. 使用新名称(例如Update)创建一个新的myUpdate_v2,并将我的服务器逻辑更新为仅使用myUpdate_v2,而不是原始的myUpdate

  3. 我认为这两种选择都有其优点。 (1)更好,因为我不需要在我的代码库中保留旧功能,但必须非常小心地为我更新的每个服务器完成,否则我可能会破坏数据。 (2)更安全(特别是如果我从模块的导出中删除旧的myUpdate,那么我可以肯定我不会在任何地方意外地使用旧的实现),但感觉有点难看否则。

    有没有更好的方法呢?我认为这是我在一个长期存在的项目中一定会遇到的事情,所以我希望有一个良好的标准工作流程来应用对事件实现的更改。

1 个答案:

答案 0 :(得分:1)

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

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