多线程下聚合的一致性问题

14-11-16 wilsonp
                   

最近遇到点瓶颈,大概描述一下。

架构采用的CQRS,当服务端接收到客户的命令后,命令处理器处理该命令,在命令处理器中从仓储中夹在聚合,执行业务,产生事件,然后业务执行完毕,更新到仓储,这一过程比较标准,没有任何问题,问题在于:当生成事件之后,有其它多个业务都需要监听该事件,然后会开启新的线程来异步处理相应的业务,这时候问题就来了,这几个异步的业务也是需要发送新命令到命令总线,然后通过命令处理器进行处理,但同时都会在在各自的线程中加载同一个聚合,然后进行修改,执行完成之后更新聚合到仓储中,当T1线程执行完成更新到仓储之后,T2再一次更新了聚合到仓储中,T2线程的改变就会覆盖T1的改变,导致T1的业务数据丢失,数据就此不一致了,如果对仓储加上Lock的话会锁住整个仓储,性能上肯定有问题,因为我只想锁住当前这几个线程操作的聚合,而不是锁住整个仓储。说得有点啰嗦,画个图就是这样的:


希望大家给点意见

[该贴被wilsonp于2014-11-16 22:01修改过]

[该贴被wilsonp于2014-11-16 22:42修改过]

                   

banq
2014-11-17 08:52

聚合根只能被一台主服务器加载,其他从服务器只是备份,主从方式是可解决一致性与可靠性。

还有采取轻量事件方式:从DevOps看EDA

[该贴被banq于2014-11-17 08:54修改过]