cqrs-node框架EventStore的组件

现在我们具有了外观的一个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);

在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);
})

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修改过]