2011-02-24 59 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被完全沒有記錄。