@zhou333666
2017-03-31T14:18:49.000000Z
字数 1248
阅读 3176
未分类
- 当一个程序含有多种业务时,业务之间会互相影响。现在让各个业务独立发展,每个地方都只做一件事情。只要一个地方负责了多项事情,就存在解耦的可能。
- 当一个程序含有多种业务,各个业务互不影响且不需向前端传递任何值。可以将各个业务独立出来,每个业务独立完成。技术方案采用:消息队列
支付宝转账1000元到余额宝
常规做法:支付宝扣除1000元,余额宝增加1000元,告诉用户转账成功
解耦做法:1:支付宝扣除1000元,做扣款记录,并告诉用户扣款成功。
2:余额宝增加1000元,通知用户到账成功,并做转账成功记录。
说明:把扣除1000元,增加1000元从一个步骤分开两个步骤走,这样达到解耦的目的。到药店抓处方药,柜台有多名员工。有两种方式抓药,第一种只让一个员工抓多种不同的药。第二种我们通知柜台每个员工只抓其中一种药,抓好了再放在一起。很明显第二种效率更高。
- 业务解耦提高了效率,但牺牲了准确率。拿药店抓药来说,如果其中一个员工没去抓药,或者药抓错了,抓少了,那整个处方药就没用了。
如果通知员工抓药通知了两次,结果员工抓药也抓了两次,那处方药也没用了。
所以必须要有一个检查机制。
- 做凭证。
员工抓药之前,记录下要去抓药,药的种类,数量。
抓药中
抓完后,比对药的种类,数量。无误,记录药已抓完。有差错,记录抓药失败。
抓完整个处方药,检查每种药。如果有哪一种药没抓,继续通知对应的员工抓药。
- 主流程照常运行,对于流程的分支通过消息队列通知相应的程序运行。区别主流程还是流程的分支其中一个方法是:两个业务之间没有紧密联系,主流程需要返回前端数据,分流程不需要返回前端数据
通知分流程的方法是采用异步方式,无法确保每次都能正确执行
解决方法:
1:查询分流程是否运行过
2:没有运行,记录分流程运行,状态为准备运行
3:通知分流程运行
4:分流程运行成功,记录的状态改为运行成功使用定时器判断业务流程运行是否正确
解决方法
1:业务表拉取该业务需要执行哪些业务
2:比对记录表这些业务有没有执行
3:没执行重新执行
字段 | 说明 | |
---|---|---|
类别 | 区别业务。比如下单,发货。代表一个整体的业务 | |
编码code | 整体业务其中一个业务的编码 | |
顺序 | 整体业务中各个业务执行的顺序 | |
预期结果 | 待定 | |
出错级别 | 待定 |
字段 | 说明 | |
---|---|---|
类别 | 同业务表 | |
编码code | 同业务表 | |
相关id | ||
参数 | 存放参数,json格式 | |
过期时间 | ||
状态 | 准备执行,执行失败,执行成功 |
当单个业务运行出错时,如果需要删除单个业务数据则删除。用定时器检查时,根据下面的业务错误级别来处理。
1:不做处理 超过过期时间,不做处理 比如:验证码
2:重新请求 比如:消息通知
3:删除单个业务数据,重新请求 比如:下单时,创建工单
4:删除单个业务数据,不做处理
5:删除单个业务数据,对主流程的业务数据的状态更改
6:删除整体业务数据
商城发货流程
商城发货检查机制