为Domain寻求一种缓存

12-02-25 donglangjohn
目前自己也在摸索着DDD,在某些方面还是很受教育的,多谢bang大。

请问是否这样的缓存框架:能够一次性update多个Object并保证该动作是"原子性" ?

个人需求的来源:

在实际项目中,有些event必须是同时被"一起消费",这样做才能成为一个有意义的event.

个人参看了Jdon的代码(还不够透彻),发现基本上都是一个operation后就立即send一个对应的event.

好像没有一种比较明确的方式来保证某些相关的event是被"一起消费"的。

如果jdon中已有了这种"保证",请bang大指出,多谢

         

16
banq
2012-02-25 08:08
2012年02月25日 07:58 "@donglangjohn"的内容
如果jdon中已有了这种"保证" ...

我理解这种保证是一种顺序执行方式:

Jdon框架事件模型提供两种种顺序执行的方式:

1. 根据事件订阅者类的名称顺序执行,比如ADomainHandler在BDomainHandler之前执行,BDomainHandler在CDomainHandler之前执行。

2. 将上一个事件的处理结果传入下一个事件,然后进行堵塞等待方式。可见jdonframework的"顺序执行"章节。

donglangjohn
2012-02-25 08:27
2012年02月25日 08:08 "@banq"的内容
我理解这种保证是一种顺序执行方式: ...

个人感觉还不是那种严格的顺序执行,而是几个event产出的msg能够被一起消费,谁先谁后无所谓。

(个人的想法是每次get Domain都是get一个副本,带版本的,相当于乐观锁,减少锁的使用。仅仅在update Domain时才用一下锁,来保证几个Domain同时被update即可,要带版本的。)

关于Domain版本的问题,个人没用Proxy,这样会导致过多的Object产生。

版本的key,为什么没放在Domain类呢,因为看上去不合适。

所以用ASM之类工具改写了Class,在new Object时用factory就好了。

banq
2012-02-25 09:04
2012年02月25日 08:27 "@donglangjohn"的内容
而是几个event产出的msg能够被一起消费,谁先谁后无所谓 ...

哦,如果是这样要求,那么队列(Disruptor)方式本身就产生这种保证,只要放进去,肯定不会消失,除非当机,取出来也能取出来。

如果希望放进去时和其他动作保证过程原子性,和取出来时和其他动作保证原子性,可以借助JMS来辅助,不过并发性能肯定差。

提供一个参考文档:

How key-based cache expiration works

里面讲Ruby提供一个updated_at功能是否是你想要的?

[该贴被banq于2012-02-25 09:08修改过]

donglangjohn
2012-02-25 09:33
2012年02月25日 09:04 "@banq"的内容
哦,如果是这样要求,那么队列(Disruptor)方式本身就产生这种保证,只要放进去,肯定不会消失,除非当机,取出来也能取出来。

如果希望放进去时和其他动作保证过程原子性,和取出来时和其他动作保证原子性,可以借助JMS来辅助,不过并发 ...

哦,不好意思,刚发现自己描述有误啊。实在抱歉。

我的意图是在同一个场景下的Domain的update工作。

一个场景内涉及多个Domain,当场景的任务结束后势必会产生event继而涉及到update Domain。

个人对Domain(Domain放在Cache里了)的实现加入了version control,当多个Domain被要求一起update时,要求Cache framework能check version,再确保都可update后在一次性的update。

当Cache update 成功后就send出event,event交由JMS(包括Disruptor)之类的工具来异步处理即可。

总体的过程是这样:

Domain活在cache里,Domain带version 这样可避免锁。

Domain的op引起event时,先拦截event 走cache来确保Domain的version正确性。

最后根据Cache方的结果来确认是否真的发出这批event(我称之为有效的event,因为update失败,意味着version不对,event也就过期了)

一直在寻找能提供这样功能的Cache,只要能带原子性的update多个Object即可.

关于Disruptor,JMS之类的工具,我仅仅用于去持久化Domain就行了。

多谢bang大

猜你喜欢
2Go 1 2 下一页