关于CQRS及异步一致性的疑惑

14-06-08 xiaoniao
    

1:CQRS 是读写分离吗?

2:Write-Side 端如何选用数据库,非关系型数据库吗?如何保证事务?而且存储的Event (为了回放)是非结构化数据格式吗?

3:Read-Side 端的数据是订阅的或同步从Write-Side端,那么还需要在内存中保留一份?因为UI 可能直接从内存中查数据?

4: 真心的不明白异步如何保证一致性的,因为没有响应的结果,还没来得及知道异步线程是处理成功还是失败,这里就继续执行下一行的流程了

请前辈赐解.

    

2
gameboyLV
2014-06-08 21:13

1、是读写分离

2.1、事件存储和存储介质无关,可以是关系型数据库,也可以是NOSQL。

2.2、无需保证事务,只需保证最终一致性即可。比如银行转账,转账前可以先将余额转移到不可用金额,待对方确认之后再扣除(或退回)不可用金额。详情参考支付宝还信用卡流程。

3、根据需求而定,Read-Side 数据可以和Write-Side不实时同步,某些复杂的报表可能一天更新一次。对于需要实时同步的数据,只需要Write-Side发事件给Read-Side 将缓存的数据设置为超时即可。

4、使用类似于嵌套回调的机制,将需要顺序执行的命令放在上一个命令的回调函数中即可。

xiaoniao
2014-06-08 23:13

1:这种异步方式,没有事务,怎么解决并发问题,比如转账,我账号共100元,同时发出转账的消息去异步处理,会不会在回掉函数里面都得到扣款成功的返回结果呢?

2:Cotroller--->Command---->Event,这个Event会被持久化为了可靠性,那这个跟Domain持久化是不是一码事?我对这个事件的职责还是不太理解!

tangxuehua
2014-06-09 19:08

楼主还是多去看看文章吧。了解清楚概念,比如:http://www.cqrs.nu

xiaoniao
2014-06-09 21:55

好的,多谢分享,我先看看。

2Go 1 2 下一页