gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:48:22 24 4
gpt4 key购买 nike

我有一个中等大小的应用程序,它使用 Data.Acid 进行持久化,并且遇到了需要更新其中一个 Update 事件的实现的情况对于下一个版本的服务器。 IE。我有类似的东西

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

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

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

  2. 使用新名称(例如 myUpdate_v2)创建一个新的 Update,并将我的服务器逻辑更新为仅在各处使用 myUpdate_v2原始 myUpdate 的内容。

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

有更好的方法吗?我认为这是我在一个长期项目中肯定会一次又一次遇到的事情,因此我希望有一个良好的标准工作流程来将更改应用于我的事件的实现。

最佳答案

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

通常这不是一个大问题;只需专门化您的代码即可。如果这还不能解决问题,也许您想将您的状态保留在 MVar 中。

关于haskell - 使用 Data.Acid 时如何处理更改事件的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20689176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com