2011-02-24 55 views
5

我开始制作Haskell网络服务器。我决定从Happstack和Happstack-state开始。我很难理解哈普斯塔克状态的概念和属性。它是一种新的数据库吗?或只是像对象图系统?Happstack-state的概念和文档?

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

回答

5

这里有两个基本介绍给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类的实例来指定存储在检查点或日志事件中的数据的实际二进制格式。在大多数情况下,这可以通过调用template-haskell函数“deriveSerialize”自动完成。还有一个Migrate类,用于在更改数据类型时将旧格式的值迁移到新格式。

有在这里的系列化和迁移机制旧的博客文章:

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

该职位是指“HAppS”,但它是非常的Happstack除了模块名称相同。

希望这会有所帮助。

+0

真的可以存储任何类型的数据,没有任何特殊要求?序列化标记...从一个特定的类派生...(哦,我是来自OO的Haskell新手)这样的事情? – Eonil 2011-02-25 03:33:00

+0

您可以序列化的类型有一些限制。例如,您不能序列化包含函数的数据类型。基本上,如果你可以为读取的类型创建Read和Show实例。 show == id',那么你可以直接在你的MACID数据库中使用该类型。 – stepcut 2011-02-25 16:17:00

3

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

恐怕我所知道的最好的文档是源码本身。 HappStack被完全没有记录。