如何让老系统变得更有活力?去哪儿对SPA系统重构的思考
·段华威:21年2月入职去哪儿网,目前在国内酒店供应链技术团队,主要负责国内酒店广告和代理商酒店报价接入的研发及运维工作。关注系统韧性,热衷于系统架构演进和重构相关内容,负责落地过广告系统 DDD 重构、SPA 业务重构、SPA 稳定性建设等项目。
SPA 侧接入了20+种不同类型的代理商,每种代理商业务逻辑不同; 15年进行过一次比较大的业务调整,主要是针对 C 的业务进行了大量适配和接入工作,对原有设计方案有比较大的侵入和影响; 19年经历过一次系统的合并,2个系统进行了合并处理,但其实现只是代码的迁移,不管是从代码风格、代码设计、还是功能实现上,都有非常大的差别,合并后的系统存在大量重复业务逻辑,整个链路处理显得更加复杂; 复杂的异步编程带来的代码可读性差,导致查问题的速度慢,也是让开发同学一直诟病的问题。
现有系统逻辑复杂,学习维护成本高; 业务价值不清楚,线上的逻辑没人懂,不敢轻易动; 业务逻辑耦合严重,需求开发工时变长; 历史需求导致业务比较复杂,线上工单问题较多;
主要目的是为了降低业务复杂度,更加明确 SPA 的定位和核心诉求,提升系统可维护性; 次要目的是优化代码实现,精简无效链路,提高代码可读性。
规模: 通过分而治之拆分领域, 然后根据业务能力, 划分出不同的独立自治的限界上下文.分而治之的过程首先是自顶向下持续分解的过程, 然后又是自底向上进行整合的过程. 结构: 需求分为业务需求和质量需求, 通过分层架构隔离业务复杂度和技术复杂度. 理想情况下, 我们应该保证业务规则与技术实现是正交的, 避免业务复杂度和技术复杂度相互影响. 变化. 领域模型不仅封装了领域知识, 而且还进行了适当的抽象来提高拓展性. 至于抽象是否合理应该结合业务进行分析, 需要对业务的发展有一定的洞察, 才能设计出拓展性较强的领域模型.
通用域: 非应用独有的,多个应用都会有的功能。例如发送邮件,触达等 核心域:和竞争对手区别开来的区域,或者是在市场上被赋予了竞争优势的区域。 支撑子域:其余的区域
关联模型与软件实现; 基于模型提取统一语言; 开发富含知识的模型; 精炼模型; 头脑风暴与试验。
通过事件风暴盘点业务资产,梳理现有业务流程,识别业务能力; 通过问题聚焦,提炼关键节点,划定核心业务和非核心业务。
代理商内部处理:代理商域的能力在于将代理商侧信息和Q侧数据进行关联,对后续处理屏蔽了代理商维度的差异; 通用报价处理:负责核心报价处理,对代理商返回报价通过相应规则去过滤、聚合、报价处理等;
作为被调用方,承接上游系统的调用; 作为发起方,负责对下游系统的输出
作为被调用方,负责按照代理商+酒店+日期维度,提供对外各代理商报价查询能力; 作为发起方,负责适配各代理商的报价获取流程,以及接入各代理商酒店/报价数据,提供不同代理商报价信息接入的能力
每个业务阶段的输入输出都是确定的,而针对多种代理商的接入差异,我们聚焦到了其中的代理商报价获取阶段中,屏蔽了上下游其他阶段的差异; 代理商报价查询时,由于不同代理商的请求方式和报价内容都不同,比如请求方式就有 webservice 服务、http-get 接口、http-post 接口、DB 查询等,我们对 request 和 response 做了一层 Access 行为抽象,具体的代理商采用自定义的适配器模型解析,剥离了技术实现的差异,使得整个代理商报价请求链路更为清晰。
无法明确每种报价请求的具体入参是什么,比如 wrapper 报价和 order 报价的参数,到底有什么不同?比如不同代理商之间到底哪些参数是共用的,哪些是独有的? 参数贯穿全流程,而 query 对象在每次请求中都应该是一次构建即不可变,但实际中为了兼容,会在各代理商内部做重新赋值操作,这就造成了严重的业务耦合出现
动态报价参数:例如 入离日期、进订时的房量等,这部分依赖于实时报价请求,属于动态报价参数; 报价静态数据:每次的报价请求虽然不同,但一些基础数据如代理商信息和酒店信息,这部分相对报价请求而言,属于静态数据; 代理商报价及过滤信息:报价和过滤原因其实就是 SPA 的核心处理,依赖报价请求和代理商返回
后续业务迭代,要确认符合模型规范才可以修改,从而控制 context 的腐化。
支持异步(更好的支撑系统高并发) 可读性高(聚焦业务流程,减少技术细节干扰) 稳定性(最好是Q侧有落地经验) 支持复杂业务编排(应对复杂多样的代理商业务)
Flux,同样实现了 org.reactivestreams.Publisher 接口,代表0到 N 个元素的发布者(Publisher)。
Mono,实现了 org.reactivestreams.Publisher 接口,代表0到1个元素的发布者(Publisher)
我们的问题是什么?找到主要问题点 我们可以做什么,列出待办项 我们应该怎么做?列出优先级,分期实现
以上就是本次分享的所有内容啦!
最后,给大家带来一些岗位招聘信息。
你与驼厂只差一份简历的距离
快扫码投递吧