交易中台系统设计与思考

前言

将近两年的时间,我一直在某企业做中台系统的研发,最近可能这段工作经历可能要结束。本文也算是这段经历的回顾与反思。

系统架构

在这里主要想说的是服务接入层,在我们目前的系统架构中并没有服务接入层。但是在我日后的反思中,觉得服务接入层的存在还是很有必要的。

服务接入层的作用

  1. 防腐层作用。因为业务中台要服务于企业内多条业务线,日常开发中应对不同的业务需求,我们常常在底层服务中的添加许多转换、判读逻辑,而引入了服务接入层我们可以把这些代码放到服务接入层。
  2. 业务隔离。企业内每条业务线都有其业务的独特场景,有的对于服务的调用比较平缓,有的业务可能在某一时间集中爆发。作为中台我们不希望某一个业务的某个场景或者bug导致所有业务的不可用,所以可以在接入层针对业务来进行服务的限流(主要方案是Sentinal的热点参数限流)。
  3. 便于对外输出能力的管理。在后续的开发中开发人员只需要对于接入层的接口进行接口文档的编写以及文档的维护即可。其次整个中台的开发人员只要了解接入层对外输出了那些能力就可以对于中台的整体能力有一认知,不需要面对每个底层服务繁多的接口。

交易中台要点

在建设交易中台,或者说是业务中台的主要的设计其实有两点:

  1. 如何提供合理的接入流程提供给业务方。让业务方完整的实现自己的业务同时能够快速的接入
  2. 中台业务系统如何应对不同业务对于业务流程上的差异

接入流程

主要的接入流程入下图:

用户在前台页面购买商品。这时调用业务方接口,业务方调用中台的接口提交购买的商品等信息创建交易单,获取交易单号并与本身的业务数据关联,然后根据交易单号唤起通用的支付组件。

唤起支付组件到支付这段的逻辑业务方无需关心,支付组件直接与交易中台交互。

支付成功后,交易中台处理订单逻辑,处理完成后回调业务方,这时业务方根据回调的交易单号处理本身的业务逻辑。

接入流程在设计与演进时其实也是遇到了一些问题:

起初在第一步业务方创建的是不可见状态的订单数据,这也造成了交易系统中存在大量的无效的订单数据,后来优化成交易单,订单号复用交易单号,这样对于业务方其实是透明无影响的。

还有就是处理支付回调并回调业务方这一步骤,起初是同步的调用,这也造成了订单状态的流转反向的依赖业务方的系统,当业务方系统出现故障时,订单状态就无法正常的流转。

业务差异

下面以两个业务为例,我只描述大概的流程,真实上的业务流程可能更复杂。

在消除业务差异的时候,首先要分析各个业务的流程,找出最复杂的业务当做样本,分析哪些是通用逻辑,哪些是存在差异的逻辑。

例子中商城的流程可能是最复杂的,会员的流程是更简单的。根据上图我们也可以以持久化订单数据为节点划分为两个流程上的差异,

持久化订单前的前置处理,持久化订单后的后置处理。

我们对于逻辑抽离形成职责单一的组件,并对前置处理以及后置处理根据业务创建不同的组件调用链。

下面是示例代码:

我们首先定义组件

public interface Processor<T, R> {
    /**
     * 执行内容 ,中断抛出{@link com.xxx.xxx.infrastructure.exception.ProcessorInterruptedException}
     *
     * @param context
     * @param result
     */
    void process(T context, R result);

    /**
     * 触发调用下一个 Processor
     *
     * @param context
     * @param result
     */
    void fireNext(T context, R result);

    /**
     * 检查是否执行该 Processor
     *
     * @param context
     * @param result
     * @return
     */
    boolean check(T context, R result);
}

public abstract class AbstractProcessor<T, R> implements Processor<T, R> {
    private AbstractProcessor<T, R> next = null;

    public AbstractProcessor<T, R> getNext() {
        return next;
    }

    @Override
    public boolean check(T context, R result) {
        return true;
    }

    public void setNext(AbstractProcessor<T, R> next) {
        this.next = next;
    }

    public void invoke(T context, R result) {
        try {
            process(context, result);
            fireNext(context, result);
        } catch (ProcessorInterruptedException ex) {
            return;
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
            throw ex;
        }
    }

    @Override
    public void fireNext(T context, R result) {
        if (next != null) {
            if (check(context, result)) {
                next.invoke(context, result);
            } else {
                if (next.getNext() != null) {
                    next.getNext().invoke(context, result);
                }
            }
        }
    }
}

然后定义构建组件链的抽象类

public abstract class AbstractProcessorBuilder<T, R> {
    @Autowired
    protected AutowireCapableBeanFactory autowireCapableBeanFactory;
    protected AbstractProcessor<T, R> instance;

    @PostConstruct
    public void init() {
        initProcessor();
    }

    public abstract void initProcessor();

    public AbstractProcessor<T, R> build() {
        return instance;
    }

    public void addLast(AbstractProcessor<T, R> processor) {
        if (instance == null) {
            instance = autowired(processor);
            return;
        }
        AbstractProcessor<T, R> next = instance;
        while (next.getNext() != null) {
            next = next.getNext();
        }
        next.setNext(autowired(processor));

    }

    protected AbstractProcessor<T, R> autowired(AbstractProcessor<T, R> processor) {
        autowireCapableBeanFactory.autowireBean(processor);
        return processor;
    }
}

上面两个业务的前置调用链为

@Component
public class StoreSubmitPreProcessorBuilder extends AbstractProcessorBuilder<SubmitOrderContext, ResultDTO<SubmitOrderResult>> {
    @Override
    public void initProcessor() {
        addLast(new CheckSubmitOrderNumProcessor());
        addLast(new CheckItemBuyNumLimitProcessor());
        addLast(new PaddingAddressProcessor());
        addLast(new CheckDeliveryLimitProcessor());
        addLast(new QuerySkuProcessor());
        addLast(new CheckSkuProcessor());
        addLast(new CalPromotionProcessor());
    }
}

@Component
public class PrimeSubmitPreProcessorBuilder extends AbstractProcessorBuilder<SubmitOrderContext, ResultDTO<SubmitOrderResult>> {
    @Override
    public void initProcessor() {
        addLast(new QuerySkuProcessor());
        addLast(new CheckSkuProcessor());
        addLast(new CalPromotionProcessor());
    }
}

简化后的提交订单代码为:

        getSubmitPreProcessorBuilder(bizType).build().invoke(context, ret);
         if (!ret.isOk()) {
                return ret;
         }
         //.....

通过这种组件化的方式,我们就可以根据不同的业务获取不同的ProcessorBuilder 来应对流程上的差异。

中台的思考

中台提供的不只是接口与组件这么简单,例如交易中台,还需要提供订单的管理后台,订单数据的可视化,通过不断的强化中台的能力,来让前台业务更专注于本身业务。

中台提供的能力要不断的推广,当单一业务提出的需求有意义,在实现后可以以其为成功案例,推广到其他业务,让其他业务享受到中台建设的红利,只有不断的推广,业务不断的反馈,中台的能力才会越强。

中台不仅是业务架构,也是一种组织架构,只有组织架构独立才能保证不会对某些业务产生资源上的倾斜。

中台的搭建要根据企业的实际情况,明确景愿,解决企业相应的问题。

Tips:文中业务示例也为参考京东业务示例,示例代码也是对实际代码的修改

原文地址:https://www.cnblogs.com/javanoob/p/trade_middle-platform_design.html

时间: 2024-10-28 20:37:39

交易中台系统设计与思考的相关文章

数字化转型之如何做好企业中台的架构设计

产业互联网时代,企业数字化转型将成为一种趋势.全球知名调研机构IDC此前的一项调查显示,到2018年,全球1000强企业中的67%.中国1000强企业中的50%都将把数字化转型作为企业的战略核心:到2020年,中国GDP的20%将来自业务数字化转型的增加值,数字化转型将上升到宏观经济层面,在改变企业运营方式的同时重塑经济面貌. 数字化转型其实是将数字技术应用集成到企业内部的管理领域和外部变化的商业环境中去,从而对整个业务价值链产生决定性的改变.那么数字技术如何帮助企业进行数字化转型呢?那就要从中

对LR analysis的平均事务响应时间和summary中时间值不同的解释

最近在做性能测试对LR结果分析时,又碰到了关于summary里与平均事务响应时间中各交易的响应时间值不同的问题.在此做个记录. 若交易中设置了思考时间,分析时需要注意查看是否过滤思考时间. 设置是否包含的方法:view->summary filter中,有是否包含思考时间的过滤条件(LR11中是最后一项). summary中:默认是根据整个场景的运行时间来进行采样的.若需要修改可在view->summary filter中,设置场景的执行时间. 平均事务响应时间中:LR根据场景运行时间等因素,

读《韭菜的自我修养》

一.背景 十一国庆节的时候,坐高铁回重庆了. 当时还在高铁上写了一篇腾讯的文章<腾讯的竞争力与组织架构>.腾讯这次调整,目前看仅仅时BG进行合并,还没看到实质性的调整,等过几个月再看看会如何深入调整吧.如果仅仅是BG合并,那其实是否调整都没有区别. 国庆期间把<简单的逻辑学>看完了,基本的逻辑分析,其实每个人都需要掌握的.很多人分不清谣言.上当受骗都是缺少逻辑的原因. 回深圳坐的是慢车,是的,就是传说中的绿皮车. 路上看了两本书李笑来的<韭菜的自我修养>和禁书<美

应用系统设计思考

基于及时反应的应用系统是软件系统近些年来的一个发展趋势(信息的价值随时间变久而价值减少),从设计上需符合Reactive宣言四大部分 1. 对事件反应 2. 对资源载入反应 3. 对失败反应 4. 对用户訪问反应 通过宣言能够总结反思过去软件设计的一些教训,比方: 1. 在分布式系统中把状态做集中式地存储.(可用性.分区性受到挑战) 2. 把分布式系统中的一致性问题只交给存储部分处理,如数据库.(应用的一致性对可用性.可扩展性能影响非常大) 3. 应用模块之间信息传递强耦合 .(函数同步调用)

中台服务架构的一点思考

中台服务架构的思想是伴随着企业规模不断扩大.业务多元化而形成的.如阿里巴巴将集团20多个核心业务中公共的.通用的业务以服务的方式沉淀到了共享业务事业部,这套共享服务体系为阿里巴巴集团的核心业务赋能,真正发挥服务重用的价值. 说到中台服务就需要提及SOA (面向服务的架构).百科上关于SOA的介绍如下: SOA是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来.接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台.操作系统和编程语言.这使得

冷思考:数据中台的迷失与前行

数据中台今年很火,火的有点突如其来,也让很多用户为之而迷失. 这波由互联网巨头们带起来的中台热潮,看似偶然,其实必然.它让我们真正意识到数据形成资产化之后带来的巨大价值,以及企业与机构在未来的竞争中构建起数据资产体系和组织架构调整的重要性. 当数据中台成为大势所趋之际,对于各大传统行业而言,不禁要问:如何打造适合自身业务的数据中台?互联网公司的数据中台战略固然有其可取之处,但是邯郸学步则可能导致满盘皆输.事实上,数据中台终究只是一个代名词而已,形成适合自身业务的数据资产管理体系,通过数据资产化实

交易基础(一)投资前思考

1.投资品种概括a->房地产投资:指资本所有者将其资本投入到房地产业,以期在将来获取预期收益的一种经济活动.b->保险投资:保险企业在组织经济补偿过程中,将积聚的各种保险资金加以运用,使资金增值的活动.c->银行理财产品:投资者将资金拖由银行打理,并在一定的单位时间后获得一定的收益.d->债券:政府.金融机构.工商企业等直接向社会借债筹措资金时,向投资者发行,同时承诺按一定利率支付利息并按约定条件偿还本金的债权债务凭证.e->股票:股份公司为筹集资金而发行给各个股东作为持股凭

关于大型系统设计原则的思考

以下以公共信息平台作为大型系统的典型代表.   在进行设计原则的讨论之前,首先要明确一个事实: 在一个软件项目团队中,在讨论项目设计的时候,每个人都会有自己的设计理念.这些设计理念一般都跟每个人的成长经历有关系.跟用户密切接触的人员,比如:产品经理,售前经理等,在设计一个系统的时候更考虑整个系统如何设计才能更加方便用户,更加贴合用户的业务流程,才能解决用户面临的问题.而研发体系的人员,比如:系统架构师,开发经理,一般更加侧重于系统架构如何高效运行,如何减少代码工作量,如何减少系统的复杂度. 因此

关于交易接口思考

1.在Api交易中,哪些是必须要走的步骤? 1.连接服务器,2.查询账户信息,3.订阅证券价格,4.交易(买入或卖出) 2.可选步骤? 1.获取委托回报,为什么不是必须,因为我不获取委托回报,直接去查账户信息也可以 2.打包器.解包器和过滤器等,这些可以后面再看,不是必须的. 3.要求有哪些? 1.稳定可靠,不要经常崩溃,2.对速度没有特别要求. 原文地址:https://www.cnblogs.com/bawu/p/8277692.html