cqrs-node框架EventStore的元件

brighthas發表於2012-07-31
現在我們具有了外觀的一個CQRS的模型。參看 http://www.jdon.com/44191

但後端技術層的 EventStore 應該是個什麼樣呢?我們一起來探討研究吧。

我眼下能想到的進展如下:

EventStore

// 這裡store的可以是event也是shapshot。
// 這個方法是由repository呼叫的。例如:
// 我們 eventStore.store(event); 之後再  eventStore.store(shapshot); 那麼,
// 這時候這個 shapshot 就是event之後的aggre的快照。
// shapshot 內部有個 num 表示他最後的一個 event的num.
eventStore.store(event/shapshot); 

<p class="indent">


在EventStore採用了Cache技術,store時會先儲存在記憶體中,然後非同步的儲存到資料庫中,先進先存的機制。

store() ---> cache ---> DB

這個好處是保持其 一致性 和 效能 。

我們在 eventStore.store 內部加入 setTimeout模擬器,看看如下測試程式碼

var eventStore = ...


var e1 = new Event('changeName',{name:'name01'})
e1.aggreId = '001'

var e2 = new Event('changeName',{name:'name02'})
e2.aggreId = '001'

var e3 = new Event('changeName',{name:'name03'})
e3.aggreId = '002'

var e4 = new Event('changeName',{name:'name04'})
e4.aggreId = '002'


eventStore.store(e1);
eventStore.store(e2);
eventStore.store(e3);
eventStore.store(e4);

eventStore.on('to db store success',function(event){ // 監聽當event儲存到db中成功的事件
   console.log(event.data.name);
})

<p class="indent">


result
name01
name03
name02
name04

這個 result 說明 ID01 和 ID02的aggre的Event儲存是非同步的,而且互補干擾。

當ID=01 的aggre的event store時,實際上是加入到 eventStore 的cache中的,然後內部有監聽器開始運作,對於ID01的event cache進行逐個同步的儲存,保持其順序,當儲存成功後刪除一個,再次下一個...

這個方式可以保證非同步的效能,和針對一個aggre的事件儲存是同步的順序的。






[該貼被brighthas於2012-07-31 13:14修改過]

[該貼被brighthas於2012-08-02 08:20修改過]

[該貼被brighthas於2012-08-02 08:57修改過]

相關文章