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

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

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】

目录
相关文章
|
安全 数据安全/隐私保护
亲手把360奇安信软件卸载了,爽!
由于工作原因,在上一家公司安装了360奇安信安全软件,到了下一个公司还需要安装另一个安全软件,这个必须要卸载,卸载!卸载!
2609 0
 亲手把360奇安信软件卸载了,爽!
|
2月前
|
人工智能 自然语言处理 机器人
电话语音机器人实时打断怎么测?Barge-in延迟、误触发与状态恢复测试方法
实时打断不只是“用户说话后机器人停止播放”。完整的Barge-in测试还要验证打断识别、TTS停止、语义接收、旧状态撤销和任务恢复。本文给出测试链路、用例设计、日志结构与统计脚本。
269 2
|
2月前
|
存储 人工智能 关系型数据库
湖库一体:2026年数据库架构的“终极答案”还是新瓶装旧酒?
2026年6月,OceanBase发布湖库一体AI数据库,阿里云PolarDB年初已推出AI数据湖库(Lakebase),Databricks也在6月推出了LTAP架构。“湖库一体”成为2026年数据库圈最热的概念之一。本文从湖库一体的概念定义出发,拆解其技术原理,对比“湖仓一体”与“湖库一体”的差异,分析三大厂商的落地路径,并讨论这一趋势对DBA和架构师的现实意义。
|
9月前
|
存储 缓存 运维
Windows设备停止错误代码43 怎么解决
Windows错误代码43表示系统检测到设备(如显卡、蓝牙或USB设备)报告问题,是 Windows 操作系统中常见的设备管理器错误,当系统检测到某个硬件设备无法正常工作时,便会显示错误信息‌通常由硬件故障或驱动程序损坏引起‌。
1926 0
|
3月前
|
缓存 API 调度
DeepSeekFlash 批处理偶发超时,​D​М‌X​Α‌РΙ 调稳记录
DeepSeekFlash因高并发下偶发超时,需工程化调用保障稳定性;DМXΑРΙ提供统一API底座,实现鉴权、重试、上下文裁剪、可观测性等能力,助力deepseek-v4-flash从“可用”迈向“可规模化默认部署”。
|
5月前
|
运维 JavaScript Java
如何开发一套患者随访管理系统?附现成源码方案
本文提供患者随访管理系统从规划到落地的全流程指南:涵盖需求调研、架构选型(单体/微服务)、核心功能开发(MVP→扩展→集成)、数据安全合规(等保、HIPAA)、测试部署运维,并推荐基于Spring Boot+Vue的现成源码方案,助医院高效落地。
384 5
|
自动驾驶 物联网 5G
什么是 5G 以及它如何工作?
【8月更文挑战第23天】
3845 0
|
SQL 分布式计算 Serverless
阿里云 EMR Serverless Spark 版正式开启商业化
阿里云 EMR Serverless Spark 版正式开启商业化,内置 Fusion Engine,100% 兼容开源 Spark 编程接口,相比于开源 Spark 性能提升300%;提供 Notebook 及 SQL 开发、调试、发布、调度、监控诊断等一站式数据开发体验!
1232 3
阿里云 EMR Serverless Spark 版正式开启商业化
|
编解码 监控 算法
高动态范围成像:超越人眼的视觉体验
【10月更文挑战第15天】高动态范围成像(HDR)通过捕捉更广泛的亮度范围,超越传统图像和人眼的极限,提供卓越的视觉体验。本文深入解析HDR的基本原理、技术特点及其在摄影、电影、游戏、医学影像和工业检测等领域的广泛应用,展现其引领视觉技术革命的独特魅力。
1832 2
|
XML 监控 Java
异步日志:性能优化的金钥匙
本文主要介绍了Log4j2框架的核心原理、实践应用以及一些实用的小Tips,力图揭示Log4j2这一强大日志记录工具在现代分布式服务架构运维中的关键作用。