【问题标题】:Happstack-state concept and docs?Happstack 状态概念和文档?
【发布时间】:2011-07-03 06:35:03
【问题描述】:

我开始制作 Haskell 网络服务器。我决定从 Happstack 和 Happstack-state 开始。而且我很难理解 Happstack 状态的概念和属性。它是一种新的数据库吗?还是只是像系统一样的对象图?

你能解释一下它的概念和属性(特别是关于 ACID,它是如何在磁盘上持久化数据的!)或者给我一个描述它的文档吗?

【问题讨论】:

    标签: database haskell concept happstack


    【解决方案1】:

    以下是MACID的两个基本介绍:

    http://happstack.com/docs/crashcourse/HappstackState.html#happstack_state

    http://www.kuliniewicz.org/blog/archives/2009/04/05/happstackstate-the-basics/

    唉,两者都没有涵盖 IxSet,它是一种经常与 MACID 一起使用的数据类型,以提供具有多个索引的集合(类似于 SQL 表)。

    MACID 是一种“ram cloud”风格的持久存储,这意味着您的整个数据集都存储在 RAM 中。它目前支持复制。开发版本的重点是添加分片支持(除其他外)。

    MACID 的独特之处在于它存储了普通的 Haskell 数据类型,并且查询是使用普通的 Haskell 函数编写的。您不仅限于 Haskell 数据类型的一小部分,例如 Int 和 String。相反,您几乎可以使用任何用户定义的数据类型。

    虽然 MACID 将工作数据集存储在 RAM 中并且不是围绕关系模型构建的,但它仍然提供 ACID 保证。持久性属性确保一旦提交成功返回,如果它们是服务器故障(或重新启动),事件将不会丢失。

    通过将每个更新事件记录到预写日志来实现持久性。如果服务器出现故障,则可以通过重播自上一个检查点以来的任何事件来恢复状态。

    预写日志中的事件由更新函数的名称和该函数的参数组成。由于更新事件是纯粹的,因此重放它们总是会导致相同的最终状态。

    存储在检查点或日志事件中的数据的实际二进制格式是通过创建 Serialize 类的实例来指定的。在大多数情况下,这可以通过调用模板-haskell 函数“deriveSerialize”来自动完成。还有一个 Migrate 类,用于在您更改数据类型时将值从旧格式迁移到新格式。

    这里有一篇关于序列化和迁移机制的旧博文:

    http://nhlab.blogspot.com/2008/12/data-migration-with-happs-data.html

    那篇文章指的是“HAppS”,但除了模块名称之外,它在 Happstack 中几乎相同。

    希望这会有所帮助。

    【讨论】:

    • 真的可以存储任何类型的数据而无需任何特殊要求吗?序列化标记...源自特定类...(哦,我是 OO 的 Haskell 新手)这样的事情?
    • 您可以序列化的类型有一些限制。例如,您不能序列化包含函数的数据类型。基本上,如果您可以为 'read 的类型创建 Read 和 Show 实例。 show == id',那么您可以直接在 MACID 数据库中使用该类型。
    【解决方案2】:

    MACID 不是数据库,首先它只是一个 ACID 框架,也就是说,它关心事务安全,正是通过保留磁盘上的事务日志。最重要的是,您可以使用例如IxSet,它们是类固醇套装和标准选择,但你也可以自己动手。

    恐怕我所知道的最好的文档就是源代码本身。 HappStack 的文档完全不足。

    【讨论】:

      猜你喜欢
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多