如何处理在使用Data.Acid时更改事件的实现
我有一个中等大小的应用程序,使用Data.Acid
持久性,我遇到了一个情况,我需要更新下一个版本的服务器的一个Update
事件的实现。 即我有类似的东西
myUpdate :: Update MyState () myUpdate = <some outdated implementation>
现在,显然我不能随意改变执行方式,因为它会破坏我的交易历史,所以我想知道人们通常如何处理这个问题。 我看到我的select是:
-
停止服务器。 为我的
AcidState
运行createCheckpoint
。 更新Event
实施,然后重新启动服务器。 由于我们从一个新的快照加载,更改的Update
不应该触发旧的事件。 -
使用新名称(如
myUpdate_v2
)创build一个新的Update
,并更新我的服务器逻辑,使其只使用myUpdate_v2
而不是原始的myUpdate
。
我认为这两种select都有其优点。 (1)更好,因为我不需要保留我的代码库中的旧function,但必须非常小心地为每个更新的服务器执行,否则我会冒损坏数据的风险。 (2)更安全(特别是如果我从模块的输出中删除旧的myUpdate
,所以我可以肯定,我不会意外地在任何地方使用旧的实现),但是它感觉有点难看。
有没有更好的方法来做到这一点? 我认为这是我一定会遇到的一个又一个长期项目,所以我想有一个很好的标准工作stream程来应用对我的事件实施的变化。
解决的办法是不要使用像“改变”这样的高阶函数。 酸状态(ACID保证,远程运行代码等)的好处是仅使用可串行数据的代价。 这个限制不太可能被解除。
通常这不是一个大问题; 只是专门化你的代码。 如果这不能削减它,也许你想保持你的状态在MVar。