DDD 缓存何时持久化

13-03-04 tbyes
持久化选用SqlServer

我所知的三种持久化方式

1:定时:内存模型在某个时间点回写到数据库文件中(弱一致性-最终一致性)

2:异步:每次模型状态改变后,提交持久化操作到工作队列中去异步执行(弱一致性)

3:即时:每次模型状态改变后,立刻以阻塞的方式进行持久化

我在实践第一种方法,但以此而来产生了一些问题,请各位道友赐教

A1:选用第一种方法后,模型在某个时间点才回与数据库文件一致。那此时需要按照几个条件查询一个列表,排序后选取某一页返回。此时因为内存与数据库并未同步,如何实现这个查询呢?

如果换做第二个方法来实现,因为不同步产生的精确度还在可以容忍的范围内。

但这里也有一个问题

A2:

假设一个模型,有三个业务方法 A、B和C

因为某个命令,模型需要执行方法 A ,再执行方法 B,之后保存

模型在执行方法A时,是通过的。但之后执行B的时候,模型验证报错。

此时,另外一个线程在执行方法C,之后也提交保存了。

由于内存中,模型是同一个,就导致了数据库里保存下了一份错误的数据。

对于A2,我觉得是自己某个地方弄错了,但不知道错在哪里

希望 @banq 和道友们严厉的指出批评我

[该贴被tbyes于2013-03-04 19:09修改过]

[该贴被tbyes于2013-03-04 19:09修改过]

                   

4
brighthas
2013-03-04 20:00
QA1 : 既然是最终一致,瞬时一致肯定做不到的。

QA2 : 在操作Aggre时,如果有特殊需要,可以lock this object. 或使用单进程运行 Domain ,采用内存缓存进行Domain内部使用,可保证Domain的运行一致。

tbyes
2013-03-04 22:48
@brighthas

利奥,好久不见

是的,我是在找寻一种方法,在查询的时候,是否可以把内存中的数据结合起来。

brighthas
2013-03-05 08:52
好久不见,这里还有个事儿,domain内部的那个cache是“内存真实体”,也就是说,领域不依赖DB本身进行运行,当然这是题外话,具体我和道友探讨了一些,具体看这里

至于解决domain和 UI query的一致性,也有办法,就是监听domain内部状态,举例来说。

      var  domain  =   require(‘jsdm’)();
      // asycCallback 回调函数就是监听这个命令DB整体完成后再调用,也就是数据已被修改。
      domain.exec(命令, asycCallback);

<p>

这只是一个方法,其实解决方法不只一个,一起探讨吧。

tecentIDC2B36
2013-03-05 10:53
有个疑问,不是立即持久化的时候,中间当机了怎么办?

猜你喜欢
4Go 1 2 3 4 下一页