[关闭]
@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:删除整体业务数据

举例

商城发货流程
cmd-markdown-logo
商城发货检查机制
cmd-markdown-logo

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注