下单领域架构思考

174 阅读10分钟

架构愿景:建设能支撑业务XX年发展的业务系统(无代际)

内核的不变性:业务的变化是界面、流程、逻辑、规则的变化,基础业务要素对象不变。如人、货、场、订单等

结构的不变性:内核是灵魂,结构是身份标识,好的结构应该是快装快拆(0成本下线、灵活组装)

API的不变性:API即是生命周期,面向对象抽象,需要考虑到数据扩展,在多场景下,可对API分层

组件的隔离性:隔离是隔离变化,面向领域高内聚,组件应该是无状态(自包含),可以任意组合扩展(理想态)

关键挑战&应对思路

  1. 从业务视角将下单系统分为4层,这每一层会形成一个天然的屏障,将不同的需求过滤掉,越上层的改动成本越低,所以我们需要不断提升上层需求的占比。上面2层主要是用扩展和配置化的方式来支撑不确定的需求,下面2层主要是平台能力抽象,从而实现平台跟业务分离。同时也实现了对需求变化的屏蔽。我们假定的是平台的逻辑是抽象沉淀通用逻辑,在新的需求场景来的时候,平台层也基本是可复用的。在这个角度需要2个关键点做好,一是平台逻辑的抽象建模,需要保障高复用,另一个是平台层是可扩展的。

  2. 平台层的设计方向是收敛稳定的,平台层的核心目的是确保复用,代表不断变化的需求背后不变的部分的沉淀;业务层的设计需要是开放的,业务层的主要目的是用来支撑不断变化的需求。

  3. 扩展性是用已知能力去支撑未来需求的关键设计,扩展性可分为4种:1是业务逻辑的扩展,通过扩展点来实现;2是数据的扩展,需要支持模型扩展来实现;3是流程的扩展;4是界面的扩展,需要支持界面的配置化搭建,通过组件化来实现。能力的抽象需要有高复用和可扩展性,基于领域对象进行抽象,进行子域拆分,将逻辑的变化按子域对象进行收口,并进行扩展性设计。

  4. 在日常研发中,需要严格来按照需求渗透的模型角度进行方案的设计,上层扩展实现优先,架构师同学需要做好设计把控。

  1. 业务层按垂直业务和横向业务拆分,垂直业务因为有了确定的业务身份,将业务身份相关的扩展逻辑进行聚合,天生可以做到相互隔离,隔离的本质就是隔离了业务间的变化,避免业务之间相互影响,从复杂度分析看,业务的无限增长是线性规模,是一个常数级复杂度,对系统复杂度并不会有影响;横向业务是跨垂直业务可复用的扩展集合,需要与业务相互叠加,同时横向业务之间也需要叠加,是一个指数级的复杂度,并且随着横向业务的数量不断增加,会变的很难以分析也不可维护,因此横向业务也需要有确定性的身份条件,并且需要非常严格的限制横向业务的规模,才可以很好的控制系统复杂度。在日常设计过程中,需要合理的考虑业务身份优先。

  2. 业务逻辑按子域拆分收口,子域内部抽象沉淀复用逻辑,面向子域的内部模型进行扩展性点开放设计,需要做到扩展点的数量的收敛性,扩展点不断扩张的子域是一个非常不稳定的子域。因此扩展点的开放是需要面向子域模型,而不应该是面向资源和流程抽象,如果面向资源抽象会导致子域本身的不稳定性,这是需要持续守护的关键点。

  3. 下游资源解耦,隔离下游系统变化对下单产生侵入式冲击,在下单与下游系统之间确定标准化的交互协议,技术上通过IOC进行解耦,需要共享模型(标准协议)基础,在更理想的情况下,上下游直接打通共享模型的透传,并且天生具备了模型扩展的特征,这是一个长期的演进方向。

  4. 稳定性提升,将系统日志按业务身份、能力编码进行埋点,可以做到按业务进行监控告警和问题排查,同时可以将监控告警分为平台视角和业务视角,在业务视角层面,可以做到垂直业务身份的精细化维度,这一方面可以快速定位到有问题的业务场景,还可以快速评估出影响面;比如说一个平台级的报警影响面会是全局的,业务身份的报警是局部的,这也是在分离复杂度。对于小流量的创新型业务,可以按业务身份进行精细化的运维,否则在大盘的大数据量下,小流量的业务报警非常容易被大盘报警淹没,而导致业务问题反应迟钝。

原则:通过简单通用的原则确保架构复杂度不过度劣化,给日常研发设计提供方向性指导

  1. 业务扩展原则:优先在业务层扩展实现业务需求。配置化优于扩展点扩展,扩展点扩展优于流程扩展。应该尽量避免在场景能力内使用流程扩展。

  2. 业务抽象原则:尽量要有明确的生效条件,垂直业务抽象优于横向业务的抽象

    1. 业务优先原则,在有争议和不确定的场景下,优先用垂直业务进行设计,避免场景能力的过度膨胀,带来的复杂度的扩散。

    2. 业务需要有明确的生效条件,垂直业务身份识别条件一般是确定的,场景能力的识别条件存在一定的动态性;业务需要强的确定性,而确定性是静态的,这样才可以更容易的进行系统分析,增强业务的确定性,否则会存在较大的线上资损风险(动态变化的规则是难以分析和模拟的)。

    3. 将经营业务身份与系统业务身份进行解耦,通过营销身份和系统身份的动态绑定,提升双边灵活性?

  3. 平台沉淀原则:控制扩展点数量,不随意增加扩展点。比如可以采用加一减一的原则。增加一个扩展点的同时需要减少一个扩展点。尽我们最大的努力去控制扩展点的膨胀问题,同时去倒逼大家在日常设计时的惰性,因为增加一个扩展点的成本和风险都极低,这是大家最喜欢的方式,但是会持续带来系统复杂度的发散,导致领域架构最后的难以解释和不可维护。

机制:在日常中通过流程机制保障架构完整性

  1. 在日常研发中,加强概要设计环节的落实,增强研发架构意识,减少详设评审时长,避免错误设计引起时间的损失

  2. 建立架构能力度量模型,对架构进行数据化,形成下单系统架构基线数据,用数据化的方式对架构进行科学性的评估,并定期进行架构效果Review,并用科学的手段指导架构的优化迭代,同时避免个人的主观偏好对架构产生入侵腐化。

    1. 架构指标:扩展需求比(含配置需求比),子域渗透(共享模型变更率)、扩展点规模、场景能力规模等

关键解

收敛平台层领域逻辑,优化扩展点设计,收敛扩展点增长,提升扩展点复用性,降低扩展点数量。与下游资源层解耦,抽象共享模型,提升基础能力复用,基础能力做到独立技术输出,前提是要做到外部系统的模型解耦。

加强架构运营:做好方案模板(概设、详设)、流程机制(方案review、cr)、定期进行架构效果评估

对日常需求研发,在流程上增加概设环节( ),通过概设评估,快速确定架构方案的合理性,概设环节可以做到轻量化,走线下文档化也可以达到目的。

建立下单架构评估模型,形成下单系统架构指标基线,每月定期Review防止劣化

类型指标名称口径单位目标值达成率当前值备注
一级扩展点复用率(业务身份数量+能力数量) / 扩展点数量%50%52%26%架构扩展性
一级扩展需求比(配置化需求+扩展开发需求比) / 需求总数%60%-70%18.2%
二级组件化配置比组件配置数 / 需求总数%30%--
二级扩展开发比扩展开发数 / 需求总数%40%-55%18.2%包括扩展点、模型、流程扩展
一级平台渗透率平台层变更数 / 需求总数%30%--除了子域,还包括流程的变更
二级订单子域渗透率订单子域变更数 / 需求总数%10%-233%33.3%
二级支付子域渗透率支付子域变更数 / 需求总数%10%-142%24.2%
二级物流子域渗透率物流子域变更数 / 需求总数%10%-142%24.2%
二级风控子域渗透率风控子域变更数 / 需求总数%10%--
一级扩展点数量扩展点数量加总200-19%237
二级订单子域扩展点数量订单子域扩展点数量加总15--
二级营销子域扩展点数量营销子域扩展点数量加总15--
二级物流子域扩展点数量物流子域扩展点数量加总15--
二级风控子域扩展点数量风控子域扩展点数量加总5--
一级场景能力数场景能力数量求和30-333控制复杂度,防止快速膨胀
二级流程扩展比流程扩展的能力占比%0%-6%6%
观测业务身份数业务身份数量求和---

架构的长期价值

有了稳定的顶层设计后,可以对系统架构做数字化建模,形成系统架构的数字化模型资产,以架构模型为中心,可以很好的连接软件全生命周期,从需求结构化、需求分析、系统分析、系统设计、代码开发、自动化测试、发布运维等阶段进行提升突破。