我在领域驱动开发中遇到的一些问题

g0204shuo 14-08-30
         

1.聚合根内的一致性是由聚合根来规范的,那保存整个聚合一定是要在一个线程中实现吗?若是这样的话,岂不是用到jta事务? 举个例子吧:
订单、 订单项 、商品 这个是一个比较常见的聚合了,订单是聚合根。若是我要新增一个订单的时候,要涉及到保存订单 订单项 以及里面的商品信息。这个是一定要顺序执行,放在一个事务里面?还是说我可以分多线程,触发各自的保存事件?
2.以上的例子中,若是分多线程分别触发事件,若是其中某个保存事件执行失败,该如何操作?EventSourcing吗? event是在disruptor的ring中的,一旦被取走,怎么重新触发这个事件呢?

3.在jivejdon中 EventSourcing和eventstore是如何实现的?
以上几个问题,一直困扰着我,求DDD高手指教。

         

banq
2014-08-31 10:05

EventSourcing是指在数据库保存的那些导致订单变化的事件,而不是订单状态信息了。

如果保存的是事件,需要顺序的,按照时间戳先后追加队列或文件或关系数据库中就可以了,这个时间戳是事件发生的时间。这种保存是肯定能完成的,是一个事件流,但是不需要通常锁或JTA的概念。

你这个问题也有点类似这个帖子:http://www.jdon.com/46644

[该贴被banq于2014-08-31 11:12修改过]

g0204shuo
2014-08-31 13:27

2014-08-31 10:05 "@banq"的内容
如果保存的是事件,需要顺序的,按照时间戳先后追加队列或文件或关系数据库中就可以了,这个时间戳是事件发生的时间。这种保存是肯定能完成的,是一个事件流,但是不需要通常锁或JTA的概念。 ...


banq大神,你好!
其实我所想问的是保存的是订单的状态信息的时候,而不是保存事件本身。
假如队列中保存的是顺序发生的事件,有另外的一个线程专门来处理这些事件。例如一个订单保存事件。那么在处理这个保存事件的时候可能需要多次操作数据库,这种是否需要JTA事务呢?
如果按照你上面的回复,我是不是可以这么理解:一个订单保存事件我可以拆分成多个子事件?(保存订单项、保存商品价格和数量信息)然后按照先后顺序放入事件队列,等待处理器来处理?而每个事件的处理都是一个数据库的原子操作?
某个事件处理失败,再通过手动硬编码确定重试几次,若还是失败则将该事件重新放回到事件队列?
不知道以上我所理解的是否正确。

banq
2014-08-31 15:51

2014-08-31 13:27 "@g0204shuo"的内容
其实我所想问的是保存的是订单的状态信息的时候 ...


如果是状态,因为内存中有最新的订单状态,数据库中也有一份,实际是两台服务器之间的状态复制的问题,也涉及到状态一致性的问题,可参考MySQL主从备份原理或noSQL之类数据库的replication复制方式(其实也是主服务器使用append方式保存事件,然后将这些事件对从服务器的数据库进行重放)。或分布式系统状态一致的问题,如Raft算法

简单情况下,因为数据库的状态是内存订单状态的备份,就是有一次备份失败也不用担心,因为下一次新的状态会成功覆盖前一个。

[该贴被banq于2014-08-31 15:52修改过]