我开始制作Haskell网络服务器。我决定从Happstack和Happstack州开始。而且我很难理解Happstack状态的概念和属性。它是一种新型数据库吗?或者只是对象图形系统?
你能解释它的概念和属性(特别是关于ACID,它是如何在磁盘上持久化数据的!)还是指向我的文档描述得很好?
答案 0 :(得分: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中几乎相同。
希望这有帮助。
答案 1 :(得分:3)
MACID不是一个数据库,最重要的是它只是一个ACID框架,也就是说,它关心事务安全,正是通过保持磁盘上的事务日志。最重要的是,您可以使用例如IxSet
,这是关于类固醇和标准选择的集合,但你也可以自己推出。
我担心我所知道的最好的文件就是来源本身。 HappStack的人数很少。