前中台拆分标准

文章首发于公众号:松花皮蛋的黑板报
作者就职于京东,在稳定性保障、敏捷开发、高级JAVA、微服务架构有深入的理解

1、 前中台定义

1.1、 前台

对用户的请求访问进行转发,对各类参数的基本验证,对不复用逻辑进行处理

1.2、 中台

可复用逻辑的实现层,具备可配置能力;对外输出完成某通用功能的组件服务或完成单一不可再次拆解业务的原子服务

2、 拆分规则

2.1、 前台拆分

2.1.1、 直接对接用户

直接对接用户的系统,比如客户前端、运营后台、商家后台均划归前台,这类系统通过调用中台服务并结合自身对不可复用逻辑的实现完成功能的开发,负责前台客户请求的转发,并对入参合法性进行验证;开放服务适配层则作为业务适配层放至前台

2.1.2、个性化临时性

个性化定制类功能,例如某个页面的楼层配置、这种业务渠道不同、配置差异很大,不具有中台通用性,诸如此类个性化很强的模块划规至前台。临时类业务,使用期限只有一段时间、后续会废弃的逻辑保留在前台,使其能灵活添加以及丢弃

2.1.3、 数据存储

前台可有自己的数据存储、用于存储一些个性化、定制化较强的数据。前台数据存储范围为——页面的配置数据、网站前端页面的灾备数据、为实现某一不具有复用性功能的数据存储

2.1.4、 开发边界

前台包含所有的页面、JS、controller层的数据封装、数据验证;前台通过调用中台的通用服务或原子服务加上本身的功能逻辑完成某个功能的开发

2.2、 中台拆分准则

2.2.1、 原子类服务

中台对外提供原子类服务,这类服务完成了某个不可再次拆解的功能、只提供原子能力。诸如促销查询、商详查询、订单详情查询、订单列表查询、用户基本信息查询均为原子类服务

2.2.2、 通用组件化服务

中台对外提供通用组件服务,完成某一通用功能,例如下单接口、各条业务线均有自己的下单流程、业务通用性高,但是下单流程中各条业务线又有差异点,差异点可通过组件配置化进行区别。现有的通用服务,如下单服务、商品发布服务、促销发布服务等均划归中台。通用组件可通过对中台原子服务的组合调用实现,也可通过引入业务身份、按业务身份对功能逻辑进行配置编排实现

2.2.3、 中台mq

中台内部用于数据同步的mq,比如用于将数据从数据库同步至redis和es的mq;中台内部业务流转mq,例如下单后订单流转状态的通知使用的mq、以及接受外部订单业务状态变化的mq,以上这类用于中台内部的逻辑处理、前台对其逻辑不可见的mq划归至中台;用于日志采集的mq插件、mq日志搜集,因其日志采集的复用性统一划归中台

2.2.4、 中台worker

中台数据同步类worker、支撑业务状态流转的worker、且为前台不可见逻辑,这类worker划归至中台;worker的实现建议统一接入任务引擎

2.2.5、 数据存储

用户数据(企业相关、账号相关、用户权益),商品数据(商品各类属性、商品关系数据),促销数据(促销规则),价格数据,交易数据(订单、快照),各业务领域的流水日志,支撑系统所有数据在中台存储

2.2.6、 开发边界

中台数据的原子操作接口,完成通用功能的组件开发,实现具有复用性的不可拆解原子服务,可配置可编排能力

3、 拆分执行规则

3.1、 前台工程目录

说明:在拆分规则中说到前台可以存储自己的差异化数据,因此需要有dao模块操作数据库;domain主要定义持久层对象po,用于与数据库层表对象保持一致;rpc用于调用外部接口、包括中台接口以及外部接口、前台内部接口;service层用于实现主要业务逻辑,以及数据组合;web层为视图层、用于页面数据的注入、前端交互数据的封装

3.2、 前台工程模块调用关系

说明:dao层直接交互数据库,用于数据库的增删改查;rpc调用中台服务,这里需要实现rpc层的监控;service层通过调用dao层以及rpc层的接口实现数据获取与封装,主要业务逻辑也放至该层实现;web层只调用service层提供的接口,这里页面需要添加响应监控以及入参日志打印

3.3、日志规范

接口调用端:rpc层调用中台服务需要添加接口的入参日志、出参日志;日志添加方式可以通过拦截器或通过filter实现,接口日志打印需要添加日志ID,日志ID采用本地线程隔离
页面请求入参:页面请求需打印出请求url,请求参数,同时日志中增加日志ID便于做上下游排查;实现方式可以通过拦截器实现
异常日志: 对于异常日志的打印、需打印出异常所在方法传入的参数、这样可以通过定位入参回溯问题场景
服务端:需打印请求入参,响应出参,并发量大的服务可动态切换日志级别或关闭日志打印
Mq日志: 处理异常的日志需打印出消息体。消息量大的mq可动态切换日志级别或关闭日志打印

3.4、 监控规范

接口监控:对consumer和provider进行监控,调用次数监控、性能监控,监控key需包含类名、方法名,同一个方法不同渠道使用监控key中最好包含渠道;核心接口需要在jsf中配置流量监控,方便排查流量来源

页面请求监控:监控controller层方法,前端页面可监控页面刷新

核心方法监控:影响该工程的核心流程的代码块、方法需要添加监控

监控key分级:监控key重要度分别为p0、p1、p2,在监控key中需体现监控级别

3.5、 实体对象规范

BO(Business Object)业务对象:封装对象、复杂对象、里面可包含多个类,用于表示一个业务对象;BO对象的包路径可存放在service层的bo目录下,也可存放在domain模块的bo目录
VO(Value Object)表现对象:前端界面展示对象,用于页面数据的展示,与前端进行交互的对象;VO对象可存放于domain模块的vo目录,也可存放于service层的vo目录
DTO(Data Transfer
Object)数据传输对象:接口对象,用于接口之间的交互,所有的接口出入参对象均用DTO对象;DTO对象定义在sdk包中
DAO(Dao access Object)数据访问对象:与数据库结构对应,一个DAO对象对应数据库的一张表;主要用在数据库访问中,存放于domain模块

对象转换方法: DAO、VO、BO之间的转换可以在各自模块中定义Mapper、Builder工具类实现,这样对象变更后只需改动对应Mapper或Builder类即可、实现代码逻辑与数据封装的隔离以及最小限度降低数据结构改变带来的代码逻辑改动风险

3.6、 中台读写服务分离

读写服务按接口分开,便于对写服务进行权限控制。写服务需增加token或者网关调用权限控制,调用方需配置token或通过申请审批后才能调用。中台对外核心服务均需采用该方式

4、 注意事项

4.1、 接口读写分离

便于做写接口权限控制,在压力达到一定量后可以借此实现读写应用分离

4.2、 需求前中台分解

需求评审需要前中台拆解委员会参加,对于前中台归属不明确的需求由拆解委员会评审决定,拆解委员会由业务支撑组成员加leader和负责po组成

4.3、 公共中间价

在开发过程中尽量使用公司统一的中间件避免独立开发,这样可以便于中间件的维护,减少不必要的成本以及风险

4.4、 中台稳定性

中台服务具有稳定性,不应因某一特定业务逻辑的变化而进行针对性开发,应避免高频变动带来的开发成本以及系统风险

文章来源:www.liangsonghua.me

作者介绍:京东资深工程师-梁松华,长期关注稳定性保障、敏捷开发、JAVA高级、微服务架构

全部评论

相关推荐

吐泡泡的咸鱼:我也工作了几年了,也陆陆续续面试过不少人,就简历来说,第一眼学历不太够,你只能靠你的实习或者论文或者项目经历,然后你没有论文,没有含金量高的比赛和奖项,只能看实习和项目,实习来说,你写的实习经历完全不清楚你想找什么工作?行研?数据分析?且写的太少了,再看项目,这些项目先不说上过大学读过研究生的都知道很水,然后对你想找的岗位有什么帮助呢?项目和实习也完全不匹配啊,你好像在努力将你所有的经历都放在简历里想表现你的优秀,但是对于你想找的岗位来说,有什么用呢?最后只能获得岗位不匹配的评价。所以你需要明白你想要找的岗位要求是什么,是做什么的,比如产品经理,然后再看你的经历里有什么匹配的上这个岗位,或者对这个岗位以及这个岗位所在的公司有价值,再写到你的简历上
点赞 评论 收藏
分享
05-11 11:48
河南大学 Java
程序员牛肉:我是26届的双非。目前有两段实习经历,大三上去的美团,现在来字节了,做的是国际电商的营销业务。希望我的经历对你有用。 1.好好做你的CSDN,最好是直接转微信公众号。因为这本质上是一个很好的展示自己技术热情的证据。我当时也是烂大街项目(网盘+鱼皮的一个项目)+零实习去面试美团,但是当时我的CSDN阅读量超百万,微信公众号阅读量40万。面试的时候面试官就告诉我说觉得我对技术挺有激情的。可以看看我主页的美团面试面经。 因此花点时间好好做这个知识分享,最好是单拉出来搞一个板块。各大公司都极其看中知识落地的能力。 可以看看我的简历对于博客的描述。这个帖子里面有:https://www.nowcoder.com/discuss/745348200596324352?sourceSSR=users 2.实习经历有一些东西删除了,目前看来你的产出其实很少。有些内容其实很扯淡,最好不要保留。有一些点你可能觉得很牛逼,但是面试官眼里是减分的。 你还能负责数据库表的设计?这个公司得垃圾成啥样子,才能让一个实习生介入数据库表的设计,不要写这种东西。 一个公司的财务审批系统应该是很稳定的吧?为什么你去了才有RBAC权限设计?那这个公司之前是怎么处理权限分离的?这些东西看着都有点扯淡了。 还有就是使用Redis实现轻量级的消息队列?那为什么这一块不使用专业的MQ呢?为什么要使用redis,这些一定要清楚, 就目前看来,其实你的这个实习技术还不错。不要太焦虑。就是有一些内容有点虚了。可以考虑从PR中再投一点产出
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务