业务中台如何实现业务结果的回调通知

简介: 这个问题暂且不表。我们先来看跨企业通信的业务回调通知。

0x01 如下RPC通信场景:业务线向交易中台发起交易。当交易完成后,zhongtai-trans要将交易结果通知给业务线。

那么,在程序实现上,zhongtai-trans如何通知业务线呢?
image.png

0x02 这个问题暂且不表。我们先来看跨企业通信的业务回调通知。这里,我们以商户对接微信支付来举例。用户在扫描商户网页上的微信支付二维码进行支付。用户支付完成后,腾讯会以HTTP的形式主动回调商户API,将支付结果通知给商户系统。

微信官网明确了支付通知的参数。商户系统收到通知请求后,根据请求参数进行自己的逻辑处理。也就是说,腾讯作为通知请求方,定义了统一的通知参数,一视同仁,不管你是商户A的系统,还是商户B的系统,腾讯不会以某个商户的意志而改变。

image.png

0x03 回过头来,我们继续来看企业应用内部服务间的业务回调。举一反三,也应按照跨企业间的业务回调通知这样来设计。即,zhongtai-trans定义统一的TransNotifyDTO,封装交易通知数据。各业务线服务内对接收到的TransNotifyDTO对象进行判断处理,或转换为自己的内部对象来进行逻辑处理。

话虽如此,在实现方面,这会遇到一个问题。我们使用dubbo作为RPC框架。dubbo规定了provider服务和consumer服务都依赖由provider提供的rpcapi。按照上面的设计,由于zhongtai-trans要调用各业务线的rpcapi,而TransNotifyDTO由zhongtai-trans-rpcapi定义,这就出现各业务线的rpcapi要依赖zhongtai-trans-rpcapi。rpcapi之间一旦存在互相依赖,那么,如果缺乏严格控制,后续开发过程中极易出现循环依赖(circular dependency)。不得不说,rpcapi之间存在jar包依赖是一个败笔。下图直观的看出来(实线代表jar包依赖)。
image.png

那么,如何搞定这个败笔呢?一个为所有rpcapi所共用的基础module发挥作用了,这里我命名为base-rpcapistyle。base-rpcapistyle的作用:定义rpcapi的通用部分,如rpcapi的返回值模型Result,基础的枚举,共同的dto对象,等。本案中的TransNotifyDTO就要放在base-rpcapistyle里。

image.png

0x04 如此清新,到这里,是时候可以贴出来示意代码了。

1)产品线rpcapi,以BizA为例

/**
 * 接收来自zhongtai-trans的回调通知
 * @param transNotifyDTO
 * @return
 */
Result<Void> notifyPayResult(TransNotifyDTO transNotifyDTO);

2)zhongtai-trans里通知业务线代码

/**
 * 交易完成,回调通知业务线
 * @param transOrder
 */
public void notifyPayResultToBiz(TransOrder transOrder) {
    Assert.isTrue(TransPayStatusEnum.isFinal(transOrder.getPayStatus()));
    TransNotifyDTO transNotifyDTO = new TransNotifyDTO();
    transNotifyDTO.setOrderNo(transOrder.getOrderNo())
            .setPayStatus(transOrder.getPayStatus())
            .setPayTime(transOrder.getPayTime())
            .setTransAmount(transOrder.getTransAmount())
            .setStatusDesc(transOrder.getTransMsg());
    Result<Void> result = null;
    switch (transOrder.getBiz()) {
        case BizA:
            result = bizAApi.notifyPayResult(transNotifyDTO);
            break;
        case BizB:
            result = bizBApi.notifyPayResult(transNotifyDTO);
            break;
        case BizC:
            result = bizCApi.notifyPayResult(transNotifyDTO);
            break;
    }
    log.info("通知业务线完成,响应结果={}", result);
}

0x05 设计要点

1)最重要的一点是,针对这种业务回调,通知参数由业务中台来决定,而非各业务线。这样,当新增业务线时,业务中台只是增加一个case和rpc请求的代码。否则,业务中台会严重违反开闭原则。

2)严防rpcapi直接的互相依赖,一定要抽象出来rpcapi的基础module,用来定义rpcapi的公用部分。

3)业务回调,本案以dubbo的rpc调用为例。除此之外,用消息中间件也是不错的选择,例如基于rabbitmq的fanout / routingKey。当然,消息msg也是由业务中台来决定。以本案为例,我们的最佳实践,是各方依然依赖TransNotifyDTO进行消息的序列化和反序列化。这样在IDE里show-usages快捷功能可以容易追踪各使用方,增强代码可理解性。

【EOF】

目录
相关文章
|
存储 敏捷开发 缓存
中台架构介绍和应用价值
中台架构介绍和应用价值
1857 0
|
微服务
为啥都说自己是“数据中台”创业,而不是“业务中台”? by彭文华
为啥都说自己是“数据中台”创业,而不是“业务中台”? by彭文华
为啥都说自己是“数据中台”创业,而不是“业务中台”? by彭文华
|
消息中间件 运维 供应链
带你读《云原生架构白皮书2022新版》——韵达基于云原生的业务中台建设
带你读《云原生架构白皮书2022新版》——韵达基于云原生的业务中台建设
454 82
|
消息中间件 关系型数据库 程序员
业务中台数据一致性方案
随着业务的发展,微服务架构逐渐成为当下业务中台的主流架构形式,它不但解决了各个应用之间的解耦问题,同时也解决了单体应用的性能问题实现可扩展可动态伸缩的能力。如下图所示,业务中台就是将平台的通用能力进行下沉,避免重复建设,形成底座平台能力,上层的各个应用服务都是基于中台能力进行快速构建。但是随着应用规模的扩大,原本在单体应用中不是问题的问题,在微服务架构中可能就是比较严重的问题,本文所要探讨的服务之间的数据一致性便是其中最具代表性的问题。本文将结合常见的电商下单场景来说明业务中台数据一致性方案。
业务中台数据一致性方案
|
存储 前端开发 算法
关于中台建设的理解及建设策略
中台是一种企业级能力,它解决企业的能力共享、业务联通和融合的问题,提供一套企业级的整体解决方案。联通是前台以及中台之间各业务板块的联通,融合是前台企业级业务流程和数据的融合,并以共享的方式支持前台一线业务的发展和创新。
2850 0
关于中台建设的理解及建设策略
|
运维 供应链 监控
韵达基于云原生的业务中台建设 | 实战派
本文将为大家分享韵达业务中台基于云原生的建设过程。主要分为三部分,第一部分是 IT 信息的发展规划,第二部分是韵达业务中台建设的详细过程,第三部分是对应云原生技术的支撑。
韵达基于云原生的业务中台建设 | 实战派
|
消息中间件 负载均衡 前端开发
​中台战略:业务中台的8个设计原则
​中台战略:业务中台的8个设计原则
1322 0
​中台战略:业务中台的8个设计原则
|
供应链 搜索推荐 数据可视化
业务中台核心服务:数字化企业建模【送书】
业务中台核心服务:数字化企业建模【送书】
|
人工智能 Cloud Native 架构师
阿里云重磅发布业务中台产品 BizWorks,中台发展进入下一个阶段
业务中台产品BizWorks重磅发布,这可以看作是阿里云在 “做厚中台” 战略上继 “云钉一体”之后的又一个新动作!
阿里云重磅发布业务中台产品 BizWorks,中台发展进入下一个阶段
|
Cloud Native 安全 Dubbo
斯凯奇全渠道业务中台最佳实践|学习笔记(一)
快速学习斯凯奇全渠道业务中台最佳实践
斯凯奇全渠道业务中台最佳实践|学习笔记(一)