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

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

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);
AI 代码解读

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);
}
AI 代码解读

0x05 设计要点

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

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

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

【EOF】

buguge
+关注
目录
打赏
0
0
0
0
41
分享
相关文章
阿里研究员玄难:如何做电商业务中台
2016 ATF阿里技术论坛于4月15日在清华大学举办,主旨是阐述阿里对世界创新做出的贡献。会上阿里业务平台事业部&淘宝基础平台技术部负责人玄难阐释了淘宝经历13年的发展中,业务平台从零到有,同时又逐步演进为业务中台。
41134 0
阿里云数据库(ADB)的多租户秘籍:资源隔离的魔法如何施展?
【8月更文挑战第27天】多租户系统在云计算与大数据领域日益重要,它让不同用户或组织能在共享基础设施上独立运行应用和服务,同时确保资源隔离与安全。ADB(如阿里云数据库)通过资源组及标签实现高效多租户隔离。资源组作为一种软隔离策略,允许为不同租户分配独立的计算和存储资源,并设置资源上限;资源标签则支持更细粒度的硬隔离,可为每个数据库表或查询指定特定标签,确保资源有效分配。此外,ADB还提供了资源监控与告警功能,帮助管理员实时监控并调整资源分配,避免性能瓶颈。这种灵活且高效的资源隔离方案为多租户环境下的数据处理提供了强大支持。
465 0
go generate指南:代码自动生成
go generate指南:代码自动生成
3356 0
我把传统业务架构升级到业务中台架构的心得
此为实战经验输出章节,重点在于自我的经验总结和实践经验记录,自己在整个过程角色是架构师和研发部门负责人角色,即设计和执行合一
如何设计高可用系统之故障隔离
简单来说,当功能或性能不符合预期,就是故障。减少故障的方式有多种,包括系统优化、监控、风险扫描、链路分析、变更管控、故障注入演练、故障隔离等。故障隔离是其中一种手段,并且要求在系统设计时就需要考虑清楚。
2601 0
1900万!阿里中标南航业务中台(2022)应用及技术架构设计项目
9月21日,南航业务中台(2022)应用及技术架构设计项目成交结果公示
568 0
Python实战:通过内置函数urljoin优雅的实现url链接的拼接
Python实战:通过内置函数urljoin优雅的实现url链接的拼接
427 0
《2017双11交易系统TMF2.0技术揭秘,实现全链路管理》电子版地址
2017双11交易系统TMF2.0技术揭秘,实现全链路管理
259 0
《2017双11交易系统TMF2.0技术揭秘,实现全链路管理》电子版地址
大型企业中业务中台建设思考
近年来从互联网领域到传统行业竟争变得日益激烈,消费者的层次结构和个性化需求在快速发生变化,企业为了应对这种变化不得不进行业务的快速迭代,在此背景下IT行业里中台的概念逐渐火了起来,大家都在谈论或实施中台化战略,中台有什么魔力能有这样的号召力,各类企业特别是跨业态的集团化企业都希望通过中台战略解决自身问题,但是我们也看到一些企业在实施中台项目中出现了严重的问题和偏差,阿里巴巴张勇曾说过:“如果一个企业奔着中台做中台,就是死”,中台最早是由阿里提出的一种IT架构理念和方法,其实中台思想古来有之,只是在互联网时代给它赋予了新的涵意。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问