关于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
好的,多谢分享,我先看看。

sinaID87521
2014-06-20 16:02
2014-06-08 23:13 "@xiaoniao"的内容
这种异步方式,没有事务,怎么解决并发问题,比如转账,我账号共100元 ...

http://www.jdon.com/46473 题目为: 异步后数据弱导致的决策失误问题

博客上改成了 同步当场处理并返回处理结果,异步后如何返回. 如何解决?

也可以百度

参见这个帖子.具体例子求解,异步后数据弱导致的决策失误问题.

谁说异步不需要事务了. 异步只是把之前同步的一个事务拆成了多个事务.

本来一个动作完成一个流程.现在多个动作就会引发一些问题.每个动作还是要在@Transaction保护下,才能避免持久化时的并发问题.

比如需要新建一个接口,通知前端整个流程是否最终处理成功. 成功该怎么用,失败该怎么做.

同步是当场得到返回结果,异步需要额外的接口通知.

期望编辑的你的主贴下面.

[该贴被sinaID87521于2014-06-20 16:04修改过]

[该贴被sinaID87521于2014-06-20 18:03修改过]

[该贴被sinaID87521于2014-06-20 18:33修改过]

猜你喜欢