中台扩展性设计(三): TMF的三个核心概念

2,250 阅读5分钟

系列文章:

一、前言

关于系统为什么会腐化,以及扩展性怎么实现可以参考前两篇文章(中台扩展性设计(一) & 中台扩展性设计(二))。本文将介绍TMF的三个核心概念: 1.业务身份,2.业务,3.能力。通过本文的分享,将介绍一下现阶段阿里的中台扩展性解决方案。下一篇文章将基于该思想,实现一套落地的框架。

二、什么是业务身份 ?

业务身份即业务的唯一标识,贯穿于整个中台的多个系统,通过业务身份可以找到业务及挂载的能力,进而找到扩展点的实现。业务身份的一般定义为采用3级编码方式"业务线.{业务线}.{业务}.${业务细分类}"的string类型,如"ecom.groupon.scenic"(电商.团购券.景区门票)。

三、什么是业务 ?

按官方解释,业务就是通过售卖物品获取利润进行经营活动的组织。业务是相互隔离的,所谓"隔行如隔山",因此业务间的流程是无法复用的。对于中台系统来说,业务就是系统的接入方,再进一步,就是中台的一组扩展点的实现

业务定义代码样例:

// 扩展点1
public interface Ext1 {
    String doSomething1();
}

// 扩展点2
public interface Ext2 {
    String doSomething2();
}

// 扩展点3
public interface Ext3 {
    String doSomething3();
}

// 业务A,实现了中台提供的扩展点1和2
public BusinessA implements Ext1, Ext2 {
    String code() {
        return "ecom.x.biz_a" // 业务唯一身份
    }

    String doSomething1(){    // 业务A实现了扩展点1
        return "a do something1";
    }

    String doSomething2(){   // 业务A实现了扩展点2
        return "a do something2";
    }
}

// 业务B,实现了中台提供的扩展点1和3
public BusinessB implements Ext1, Ext3 {
    String code() {
        return "ecom.x.biz_b" // 业务唯一身份
    }


    String doSomething1(){    // 业务B实现了扩展点1 
        return "b do something1";
    }

    String doSomething3(){    // 业务B实现了扩展点3 
        return "b do something3";
    }
}

四、什么是能力 ?

能力即某种通用的玩法功能,比如订金尾款玩法,免费试玩法等等。不同于业务,能力侧重的是复用,不同业务可以挂载相同的能力。从中台视角,能力也是中台的一组扩展点的实现。(从中台视角,能力和业务都是一组扩展点的实现)

能力定义代码样例:

// 能力X,实现了中台提供的扩展点1和2
public AlibityX implements Ext1, Ext2 {
    String code() {
        return "ecom.y.ability_x" // 能力id
    }

    String doSomething1(){        // 能力X实现了扩展点1
        return "x do something1";
    }

    String doSomething2(){       // 能力X实现了扩展点2
        return "x do something2";
    }
}

// 能力Y,实现了中台提供的扩展点1和3
public AlibityY implements Ext1, Ext3 {
    String code() {
        return "ecom.y.ability_y" // 能力id
    }

    String doSomething1(){        // 能力Y实现了扩展点1
        return "y do something1";
    }

    String doSomething3(){        // 能力Y实现了扩展点3
        return "y do something3";
    }
}

五、业务挂载能力

从上述介绍中,我们不难看出业务之间是相互隔离的,能力是复用的,可以被业务挂载。例如,业务A挂载了能力X和能力Y,则最终业务A就相当于实现了扩展点1,2,3。

五、扩展点冲突

细心的读者可能已经发现,业务实现了一组扩展点,能力也实现了一组扩展点,那同一个扩展点实现可能会发生冲突,需要怎么解决呢 ?(业务A挂在的能力X和Y,都实现了扩展点1,那扩展点1需要执行哪个具体实现呢)

实际上,业务和能力均有个生效的逻辑,即请求满足某种条件,业务或能力才会生效 (例如订金+尾款玩法,必须是商品上有某种特殊属性,本次交易过程才会触发订金+尾款能力)。业务和能力均需要指定优先级来解决扩展点冲突问题。

// 能力X,实现了中台提供的扩展点1和2
public AlibityX implements Ext1, Ext2 {
    String code() {
        return "ecom.y.ability_x" // 能力id
    }

    String doSomething1(){        // 能力X实现了扩展点1
        return "x do something1";
    }

    String doSomething2(){       // 能力X实现了扩展点2
        return "x do something2";
    }

    boolean match(Request req) { // 能力是否生效
        if (req xxxx) {          // 必须满足某些条件能力才会生效
            return true;
        }
        return false;
    }
}

用以下两种场景分析扩展点命中情况:

情况一:请求命中业务A,能力X和能力Y都生效

由于能力X的优先级为100最高,则扩展点1和2会选择能力X的实现,扩展点3只有能力B的实现,因此只能选择能力B相应的实现。

情况二:请求命中业务A,能力X和能力Y都没有生效

由于能力X和Y均为生效,扩展点1和2会选择业务A自己的实现,扩展点3需要怎么处理呢 ? 这里留个悬念,下篇文章将会说明这里的处理方式。

六、小结

本文对TMF核心的三个核心概念: 1.业务身份,2.业务,3.能力 进行了详细讨论,也对扩展点冲突也进行了讨论,所有的前置所需的思想概念讨论差不多了,下一篇文章将基于该思想,实现一套落地的框架。