架构总原则: 大中台+小前台的架构思路 业务中台采用领域驱动设计(DDD),在其上构建业务能力SAAS,持续不断进行迭代演进。 平台化定位,进行了业务隔离设计,方便一套系统支撑不同玩法的业务类型和便于定制化扩展。 前后端分离,通过服务接入层进行路由适配转发。 天然的分库分表,消息解耦和分布式缓存设计,支持弹性扩容,以支持大数据高并发场景。 系统逻辑架构图: 接下来将分别介绍每个部分。 电商中台: 中台部分在逻辑上分成了基础能力和平台产品两层,这样做的好处是,基础能力层聚焦于稳定收敛的业务模型和基础服务本身,不会随着业务和前台产品的调整发生变化,可以简单理解为业务模型的DAO。平台产品层则专注于通过流程编排类的技术手段,将基础能力构建成业务的解决方案,解决共性和个性化的问题。我们将以交易的设计为例来说明这个分层理念。通过对电商交易业务的深入分析, 可以确定几乎所有的交易都会涉及下图中所有的领域(库存,优惠,价格…),而单看每个域,玩法都是很少变化的,将这些域的基础能力完全可以沉淀下来形成原子的基础能力,通过扩展点方式应对将来特殊的场景个性化扩展。 平台产品层为了应对不同的交易场景(一口价,拍卖,货到付款,预售…)将原子的基础能力编排成满足不同场景的解决方案,以服务的方式透出出去。 服务接入层: 服务接入层是连接前台产品和中台产品层的纽带, 实质就是之前的web 应用,不同的是现在前后端分离后,只包含java 代码,使用springBoot web。做参数转换,路由分发,调用中台服务,结果封装。这块需要做好前后端的交互规范,请求路由映射规范,web工程目录结构,负载均衡方案,跨越问题和安全问题, 后续会有专题详细介绍这块。 公用基础组件: 沉淀和抽象出通用独立的公共基础组件,这些组件在服务本项目,本团队的同时,可以开源出去服务更多的人; 抽几个非常重要的组件讲一下这么做的目的。 数据访问组件: 抽象封装分库分表访问,读写分离,主备切换。 消息中间件组件:这块的选择非常多,就开源的就有activeMQ,RabbitMQ,RocketMQ,Kafka等等, 再加上阿里云,AWS, 腾讯云等提供的和对应的云版本,会非常多,如果不对这块做封装,对其上应用做透明化处理,后期做这块的适配调整就会非常痛苦,特别是这套系统会在不同环境中进行部署时。 地址库组件: 统一地理地址相关的服务,如果是有拓展国际市场的需求,这块会显得的非常重要,不同文化背景的国家,在这块的差异会非常大,同时国内也涉及3级,4级和5级地址的问题。 云服务&设施容器层 如果技术团队不是非常大,又没有较强的运维技术人员,建议不要购买物理机自己搭建环境,而是直接使用阿里云这些比较成熟的ECS和其他云服务,这样会节省很多时间成本和一些耗时的运维工作,让其专注于业务产品的研发,同时使用docker 容器部署应用,不仅需要的机器数量比较少而且部署非常便捷高效。 业务前台产品: ios ,android APP , H5 APP ,PC 站点,微信支付宝小程序 都是属于这层,前台产品主要是根据业务形态和产品的定位来进行构建。对于电商业务来说,主要是指移动APP商城,H5商城,PC商城 ,小程序商城。将以小程序为例来说明。 为了适应小程序,社交电商这样的热点,加上有这么优秀的一套电商中台系统,不搞出点有么有样的电商前台产品,不是很没有道理,为此想破脑袋,我们把电商和送礼结合了起来,做了“礼尚往来”的小程序,下面是产品的截图。 稳定和安全保障系统 对电商这类在线交易系统,流量会随着运营活动的波动非常大,特别是到了双11这类大活动的时候,流量的峰值会是平时的几十~几百倍,一些接口会放大的更大;核心系统的系统指标,流量,接口调用量和rt, 以及限流和异常的监控就显得非常重要了。在几年之前,只有BAT 几个大的公司有能力在这方面做的不错,随着全民参与的这种大型促销活动推动技术的进步,以及开源社区和一些大厂将类似方案回馈到开源社区,目前一个小的技术团队做好这块也没有什么难度了。现将我们用到的框架做个简单的介绍,更多细节请参考官方文档。 sentinel:是面向分布式服务架构的轻量级流量控制产品,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助您保护服务的稳定性。 该系统已经过阿里内部双11多年的验证,稳定性和可靠性非常不错,已于最近开源。 dubbokeeper: dubbo的官方监控dubbo-monitor-simple 在性能上表现非常不好,经常卡死,对比了几个成熟的框架后,最终确定使用dubbokeeper. dubbokeeper社区版dubboadmin,包括了应用管理,动态配置,统计信息,服务监控和zk信息查看功能。 pinpoint: 现在基于微服务的架构,一个请求从用户发起到响应,中间调用链路非常长,跨越数十个系统很正常,并且路径非常多,要定位一个比较耗时的响应,不利用工具,是非常低效的。Pinpoint这样的工具就是为处理这个问题出现的,Pinpoint的优点是对代码零侵入,运用JavaAgent字节码增强技术,追踪每个请求的完整调用链路。 Telegraf+ influxDB+ Grafana:主要用来实现业务数据的实时监控方案,如交易额的不正常波动,订单量的突然下跌等。Telegraf 是收集数据的代理程序,可以根据业务需要添加插件扩展服务,收集到的数据写入分布式时序数据库influxDB,再通过grafana 可视化的展示出来。 工程结构: 逻辑结构映射到物理的工程结构,每个逻辑单元对应为一个子工程,如果是用idea 开发,就是一个model, 当然model 里边会有子model;至于需要打包构建多少个系统其决定性因素是你团队的规模,如果团队规模较少,中台系统合并到3-4个左右就足够了,如果团非常大,一个团队负责一个业务板块的,并为其构建多个系统,也是非常正常的,像较大的电商公司,负责商品的就是一个团队,商品相关的系统就有数10个。以交易为例,可以将交易的系统合并为一个系统,但在工程的组织结构上是对立的,方便将来的拆分。 为什么要用业务中台化思想来架构交易系统 上面介绍了交易业务中台的设计理念,本篇会详细的来说为何要用中台的思想来架构交易系统。要说明白这个问题,我们必须回看系统的演化路径是怎样随着业务规模的增长进行变化的。 首先来看初创公司/新业务系统是如何演进的;以基于云计算为基础的架构模式,大部分的初创的系统架构图如下 对于一个业务规模很小,业务也比较单一,该架构也是最高效的方式,一到两个web系统,数个微服务业务系统,一到两个前台系统。微服务业务系统将会把会员,商品,类目,店铺,交易,库存,物流这些划分成不同的模块/包放在一到几个系统,这样做的好处是非常明显的,每个人都熟悉所有的代码,代码量不大,开发效率高,这在公司刚起步时,是非常接地气的和最适合的架构。 随着公司业务规模和组织的壮大,会基于上面的架构,迭代演进N次,直到系统不再是制约公司发展的瓶颈,这期间最重要的架构升级是系统和数据库的垂直拆分,异步消息解耦,分布式事务机制,稳定性保障。为了快速说明问题,我们将忽略中间演进版本,直通基于中台的版本。 在介绍业务中台模式之前,先来看看中台概念的产生背景,中台研发模式最早产生于芬兰著名游戏公司supercell. Supercell有员工180人,后被腾讯以100亿美金估值收购,其鼎峰时期全球排名top10的游戏,有5个来自supercell, 其能快速推出高质量的游戏,其大中台功不可没。阿里借鉴了supercell的“大中台,小前台”的模式,以解决快速创新试错的前端业务和日益沉重的淘宝天猫这些核心系统之间的矛盾,以提升研发效率和跨团队合作。 可以进一步的设想,如果公司业务高速发展,特别是互联网的业务模式,出现10倍增速的发展也很正常,这会面临业务和技术团队规模变大,业务也会越来越复杂,就以交易为例,最初就是简单支撑实物购买场景(消费者付款购买,平台/商家发货),随着用户和业务的发展,会出现,虚拟商品交易,团购,拼团,拍卖,秒杀,预售等等交易业务模式。 最初就是一个系统单纯的支持一个单一的业务,到了阶段二支持三个业务,你还能勉强活着,到了阶段三如果还是使用之前的架构和开发模式,你会陷入泥潭,在阶段三必然会出现以下问题: [if !supportLists]1.[endif]业务之间的需求相互影响,修改和测试回归成本非常高,但还是会发生意想不到的线上问题。 [if !supportLists]2.[endif]由于支撑的需求越来越多,没有人能掌控全局,修改无存下手,开发越来越不敢接需求。 [if !supportLists]3.[endif]多个需求并行的开发是场噩梦,团队经常加班,还是满足不了业务需求的开发,团队越来越是瓶颈,经常接到业务方的投诉。 业务中台化也就是解决这些问题的最佳选择,将交易域的核心能力和服务,通过梳理抽象沉淀为稳定外化的服务,通过预留的扩展点,来支持个性化扩展。扩展点的开发完全可以由业务团队的技术来进行,交易中台研发将专注于中台的建设和稳定性,这样讲大大改善开发协作效率,一个业务能不能跑的快,主要依赖于前台,当然业务中台的技术团队需要做好业务隔离和中台本身的稳定高效进化。 了解交易的一般业务流程 本篇是用来讲交易的,结果扯了太多业务中台的东西,现在直奔交易,看看交易的两个业务流程。 交易订单创建流程: 简化的逆向退款流程: 只举例2个业务流程,其他的大同小异,对交易业务的分析和梳理,不难发现,交易涉及的业务域可以归类为以下几个方面:价格,优惠,库存,拆单,支付,限购,交付,订单,超时,售后。 交易业务中台架构 通过对交易业务流程和业务的分析和梳理,采用20/80原则,可以建模抽象出基础能力层 交易是很多契约的组合体,基础能力服务是最原子性的,还需要将这些通过流程编排组合成有业务价值的交易产品来统一对外输出和管理,这就是交易平台产品层的职责,解决共性和差异性的问题。 此外交易系统需要依赖会员,商品,店铺,库存,优惠,支付和物流等这样的业务服务才能完成一个真正的交易,加上这些我们基本可以确定交易的业务中台架构图,如下: 有了整体的全局大图,接下来我们将会按照如下的框架来详细介绍每个部分。 总体设计: 核心业务领域模型: 领域模型的设计,还是遵守DDD的原则,这块做的好坏,关键是对这块业务的理解和未来一段时间的预判,加上抽象归纳。 核心类图: 从总体设计的角度看,总体的类图应当是关注业务模型本身,按照之前约定,我们先看BA层的业务模型 这个类图,只画了宏观和重要的业务域类,其他用来支撑的类图,将在BA层做展示,目前帮助理解交易这些类图足够说明问题,太多反而没有重点。 PA层是对外开放的服务层,按照惯例设计,会有与其DO对应的DTO类,此外考虑到购车更多的是承担前台层的功能,BA层不会引入购车,而将其放到了PA层。 PA层的业务对象类图,除了dto 类型外,还增加了消息事件对象,用来将交易的业务变化通过事件消息通知给对其感兴趣的订阅方,要说明的一点是BA层的DO对象,PA层是完全可以使用的。 核心服务设计: 服务接入层更多的是前后端交互restful service的设计,交易的PA层实质上已经做了对外开放的微服务设计(使用dubbo框架),服务接入层的restful service几乎是对微服务进行包装参数转换的处理,就没有必要单独说明restful service,直接看PA 最重要的几个服务。 核心链路时序设计: 通过最常规的下单购买和支付流程来说明交易的核心调用链路是怎么样的过程,为了简化说明下面的时序图简化了异常链路的处理过程和人为减少了依赖的业务系统。进行核心链路依赖的设计,是为了在设计阶段更好的去评估依赖的合理性,确保交易的性能,安全性和容灾处理方面的要求。有了核心调用链路图,你才能在设计阶段确定哪些调用是可以减少的,哪些地方可以异步处理,哪些地方可以使用前置缓存,哪些地方需要异步重试,哪些地方不能超时,哪些地方要确保最终一致性,哪些要做幂等处理等等,此外也对下游系统更好的评估自己的流量和响应时间提供了参考依据。 交易这块的技术设计点非常多,分布式高并发系统遇到的经典技术问题,几乎都在着有出现,限于篇幅,将通过接下来的一篇专题文章专门介绍。 |