为Domain寻求一种缓存

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

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

个人需求的来源:
在实际项目中,有些event必须是同时被"一起消费",这样做才能成为一个有意义的event.
个人参看了Jdon的代码(还不够透彻),发现基本上都是一个operation后就立即send一个对应的event.
好像没有一种比较明确的方式来保证某些相关的event是被"一起消费"的。

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

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

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

Jdon框架事件模型提供两种种顺序执行的方式:
1. 根据事件订阅者类的名称顺序执行,比如ADomainHandler在BDomainHandler之前执行,BDomainHandler在CDomainHandler之前执行。
2. 将上一个事件的处理结果传入下一个事件,然后进行堵塞等待方式。可见jdonframework的"顺序执行"章节。

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就好了。

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

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大

2012年02月25日 09:33 "@donglangjohn"的内容
一直在寻找能提供这样功能的Cache,只要能带原子性的update多个Object即可 ...

There are only two hard things in Computer Science: cache invalidation and naming things — Phil Karlton
在计算机科学中只有两件难事:缓存失效和命名。哈哈

来自:How key-based cache expiration works

如果你在Java中找到这个缓存产品,别忘记告诉我。

单机Cache可使用Version Caching,但是一旦Scale到分布式,CAP定理就发挥作用了,情况也完全不同,大概没有人比Facebook更专长memcache了,他们认为:现实是不能解决所有缓存一致性问题。 http://news.ycombinator.com/item?id=3609447

[该贴被banq于2012-02-25 10:26修改过]