2014-06-19 06:46 "@banq"的内容
单线程访问 ...
上面代码演示的是内存并发编程; 引申到事件流式执行. 只是解决并发导致的原子问题, 但没有解决上述的业务问题.
上述方案最终钱还是80元,没有避免异步事件框架下妻子扣钱成功的问题.
昨天咨询了下我们的高T.这个场景在国外银行很常见,国外有夫妻卡.,他认为是这样实现的:
先说说不用异步事件框架实现是如何保持一致性的.
丈夫显示100元, 进行消费,向后端 传递聚合跟的objectVersion 1, 正常扣钱10. 传递聚合跟的objectVersion值+1变为2.
妻子由于也是显示100元,进行消费,所以递聚合跟的objectVersion也是1, 在你的调用方法前会做业务校验,由于版本号objectVersion不匹配,妻子会得到错误.页面重新刷新,显示90元. 妻子就不会继续消费了.
再说说异步事件架构下:
丈夫显示100元,进行消费,. 变成事件1存储. 正常返回给前端.但不是真的出钱. 而是告知用户"后台正在处理,请稍等".
妻子由于也是显示100元,进行消费,同样变成事件2存储.正常返回给前端.同样不出钱,告知用户"后台正在处理,请稍等".
这时候 列里有两个事务产生的事件. 顺序看上面两个事务commit的次序. 加时丈夫事件1先被执行. 检查聚合跟的objectVersion,成功.通过一个新接口告知给前端钱已扣除.妻子的事件2后执行,检查聚合跟的objectVersion,失败.通过一个新接口告知给前端钱无法扣除,无法消费.
同步架构采用异步架构,整个业务流程都变了. 需要新增加一个接口.还有就是.异步事件执行可能因为网络等原因产生偶然Exception.需要有重试的机制.
总结: 同步流程采用异步后. 对于开发者和产品经理来说都更复杂了.
对于开发者来说: 需要1.保存事件 2. 重试机制 3. 新增加一个接口(即异步框架里的回调接口) 4.告知产品经理流程已变成异步化.
对产品经理来说: 需要把原来的一个同步流程思考为多个流程.
那么到底是谁决定谁呢?
开发和产品经理是互相决定,影响的. 一方面当产品经理处于用户体验的角度,可能会主动把一个同步流程,拆成多个异步流程.增加步骤和接口. 这时候开发者坑并不愿意,因为增加了工作量. 另一方面开发者处于性能,并发量的考虑,可能会把PM思考的一个同步调用改成异步. 这时候产品经理需要知道要有新的页面提醒用户"后台处理中", 流程已变.
[该贴被sinaID87521于2014-06-19 11:37修改过]