点击「京东数科技术说」可快速关注

「摘要」中台乐高系统肩负着京东金融APP频道页搭建与运营的重任,在考虑到提升运营体验与降低功能迭代开发成本的前提下,尽可能的实现页面输出内容与运营规则动态可配,灵活搭建。同时,在APP高访问量的冲击下,系统的健壮与高性能也是乐高设计中必不可少的重点之一。

1

项目背景

为了配合APP大改版,旧的APP后台服务系统因多年维护与需求迭代变更,造成维护成本越来越高,且不能满足新版APP的很多功能。因此,决定启动乐高系统来承载新版APP的所有需求。时间很紧迫,任务也非常重。经过思考后,就有了第一次小组会议的初步架构设想图:

2

项目分析

作为APP后台的管理系统,主要就是操作APP每个原生页面的具体数据结构。要求各种数据动态配置,各种属性随意修改,在不进行版本升级的前提下,即时生效。简言之,也就是项目负责APP页面数据的下发,内容动态配置管理。

为了应对内容数据的可随意更改,可随时生效这个需求,我们觉得Spring Express Language(后面统一称为SpEL/EL)特别适合这个业务场景。所以,在系统里大量应用在页面数据调用接口动态取数据所需配置的地方,也成了整套系统的核心价值所在。如下图为SpEL在乐高平台的应用形式:

以及对于此类内容输出系统的特点分析如下:

3

架构设计思考

通过上述特点分析,可以知道这是一个典型的重读操作的系统,因此项目分成了两部分:

  • 一个后台管理负责配置基础页面数据,也就是模板的配置信息。

  • 一个负责响应APP的接口请求返回页面结构数据,也就是动态渲染APP所需要的真实数据结构和内容,包含千变万化的规则需求和运营逻辑。

而新项目需要新的框架去实现,我们拒绝墨守成规,希望适度的引用新技术去驱动业务的发展。因此,选型最新的Spring Boot2与JDK8配合。Spring Boot2是基于Spring5上集成而来的,Spring5是目前非常优秀且最新的Java应用框架,这个大版本增加了很多新的特性。比如:

  • JDK 基线更新

  • 核心框架修正

  • 核心容器更新

  • 含 Kotlin 在内的函数式编程

  • 响应式编程模型(重点)

  • 测试改进

  • 库支持

  • 中止支持

而JDK8的Stream,Lambda表达式等特性的应用,也成了系统开发过程中的常见姿势。具体详细架构如图:

页面数据渲染流程:

请求流:

整套系统有如下优化处理:

  1. 整个应对APP访问的页面数据渲染系统,不依赖于MySQL数据源,所有页面基础数据均读Redis缓存数据。

  2. 可封装或不封装业务接口,根据业务场景复杂度而定,一切以页面配置简易化为主。所有需要动态配置数据结构的模板元素配置项,都用EL表达式来代替。当然虽然这个方式大大提高了动态灵活性,但加大了运维人员的门槛高度,所以,第一版上线的所有表达式配置项,由研发配置。

  3. 业务接口熔断处理,基于Hystrix的熔断器与方法降级处理,做页面请求接口托底方案。另一个托底方案,是运营可以配置多个相同页面模板,根据用EL表达式描述的显示规则来做模板托底方案。

  4. 为了提升系统性能,主要做了如下几点优化处理:

  • 页面全局接口基于正则匹配的表达式抽取,相同方法参数统一请求处理,将请求结果保存在Spring EL渲染模板的上下文中作为结果变量,将原先配置的表达式替换为从结果变量中提取结果数据。这样就可做到:一个接口相同的方法,只要参数一致,无论在页面中配置了多少处表达式,在单次渲染整个页面周期时,只做一次调用。大大提升了性能,降低了延迟。

  • 异步结果请求。上面所有需要调用接口取数据的表达式,均被分配到了单独一个线程去请求结果,其实保存在上下文中的环境变量就是封装结果的Future。页面渲染时,会先分配N个线程去请求数据,等到后续真正组装结果时,才会去调用get阻塞获取结果。当然这样做,提升速度的代价就是极大消耗CPU性能,因为线程池需要设置的比较大,而具体设置为多大,还要在不断试验的基础上不断优化调整,以达到服务器最优效能和最大并发支持。

  • 基于Actor模型Reactor响应式处理页面数据。页面数据是有规则的,也就是多个模板集合组合起来的,而每个模板里又是一个元素集合,每个元素里又是一个属性集合,是个比较规范的数据结构,虽然最大的坑在于层级深度不固定,但是已经用JSON去填了这个坑。而针对这个相对规范的数据层级结构,用响应式编程(流式处理)再合适不过了。So,基于Flux使用和Subscriber的大量使用不再赘述。

  • 数据读取走本机缓存。因为从Redis读取速度还不到极致,虽然不读MySQL,但是每次构建页面数据,读多次Redis的网络开销,也是不想耗费的。所以,首要考虑的还是本机内存级缓存的实现。因此,基于Guava的LoadingCache构建本地缓存方案就集成进来了,当然效果也是非常显著的,但是本地缓存方案并不能长久支撑下去,对于后续支撑业务线的增长,能够支撑超过内存容量的缓存方案还是要考虑进来的!不排除后续随着业务的增长,缓存数据的急剧增长,增加本地硬盘数据缓存以及ElasticSearch等支撑系统。

  • 规则链式执行。因规则的多样性,一个页面每个模板甚至于每个元素都是可以去配置各式各样的规则的。比如A|BTest,坑位优先级,分流,随机等等规则均可以应用在任何模板或元素组上。为了高效执行配置的所有规则逻辑,执行规则前,将规则集创建成规则链。以模板为粒度,以第一个规则执行为起点,执行结束后,判断有无下游规则。进而每个模板被传递给下游规则去执行相应规则逻辑。基于Reactor的Flux原理图:

至于为什么会选型Reactor,主要还是基于业务场景的综合考量,对于『多模板->多元素』数据结构渲染很符合流式编程引擎的适用场景。页面规则执行的切入点,分为准备数据和调整数据,如图所示:

4

项目开发中的问题

项目的研发进度还是很快的,这源于团队的高效工作与优秀的执行力。但由于时间紧迫,各业务方提供的接口也参差不齐,返回结构也形态各异。这也是没有一上来就做接口规范所挖的坑。

  • 因此有一个很大的工作量就是重新封装各业务方接口,包装成自己所负责页面方面用表达式SpEL描述的样子。而这些工作的确是可以通过事先规范好接口返回标准来避免的。

  • 其次有个很大的工作量就是SpEL表达式在各业务页上面的配置,因为需要验证表达式正确性,需要到预发环境验证,因为没有测试环境,对工作效率造成了很大的影响。后来,为了应对这个SpEL验证表达式正确与否的问题,专门开发了一个测试接口,才一定程度上解决了这个问题。

  • 最后一个对团队比较有挑战的是管理端UI的开发。整个团队是纯后台开发团队,对于前端开发经验较少,为了让全体成员快速进阶全栈工程师,大家也是恶补了以VUE,ElementUI为基础的前端基础开发知识。目前系统配置效果如下:

5

回归分析

为了应对需求的动态可配置,采取了页面配置里各种SpEL表达式;但造成最大的一个问题就是——运营体验不佳!

– “这都是啥呀?完全看不懂!”

– “稍微一改,页面就崩了”

– “完全不敢动啊,一动就坏!”

各式各样的的吐槽声接憧而至,表现了运营对系统易用性的各种不满。的确,表达式就是代码,看不懂而且稍微改动一个标点符号的确就会造成异常!用户是上帝,如何满足易用性的需求呢!因此进行了一些优化:

  • 表达式配置改为用户选择方法,让SpEL表达式在用户看不到的地方动态生成。(这点已基本实现,先配置在系统专门维护的方法表里,然后供页面选择)

  • 尽量剥离系统中业务接口的直接引用,保持系统轻量化。采用RPC框架的泛华调用方式,避免jar包引入方式。

6

未来规划

关于乐高2.0的未来规划,一方面期望以提供平台型页面运营数据输出服务为基础,可视化配置体验以及完整活动页面输出能力。另一方面,拓展支持范畴,例如正在规划和进行的活动支持系统(暂未命名),作为乐高系统群或乐高运营支撑生态的重要一部分也在积极规划调研与实现中。

最后,乐高平台目前仍在积极的接入各部门的页面搭建需求,并提供稳定高效的服务。在欢迎大家接入乐高平台的同时,我们将积极接受来自四面八方的批评与建议,希望稳固迭代,支撑起大家对页面搭建的需求与重任。

 推荐阅读

1、玩转银河+ | 你知道一个叫银河+的大数据平台吗?

“银河+”是如何为我们处理数据的呢?让我们用漫画为您揭开数据生产演化史这层神秘面纱吧。

2、谛听|大规模主机监控告警平台的架构演变

谛听是京东数科自行研发的一套主机监控系统。整套系统对所有业务进行主机性能采集和相应的告警。

3、自动化建模 | H2O开源工具介绍

相信很多读者在日常的建模工作中都会或多或少地思考一个问题:建模可不可以被自动化?笔者围绕这个问题向大家介绍一个开源的自动建模工具H2O。

京东数科技术说&技术课堂

▼▼▼

由京东数科-技术研发部策划组织

倡导“原创·实用·技术·专业”

致力于分享技术领域实战经验与技术干货

线上订阅“京东数科技术说”,线下聆听“技术课堂”

为加强技术分享、总结沉淀,提升数科技术影响力而搭建的

线上线下融合交流平台

不只一技之长 · 我有N技在手

 咨询、建议、合作请联系:

刘嘉璐(liujialu)/张明瑛(zhangmingying3)

长按识别二维码关注我们

乐高 | 统一运营平台架构设计相关推荐

  1. QQ会员活动运营平台架构设计实践——高效自动化运营

    QQ会员活动运营平台(AMS),是QQ会员增值运营业务的重要载体之一,承担海量活动运营的Web系统.在过去四年的时间里,AMS日请求量从200-500万的阶段,一直增长到日请求3-5亿,最高CGI日请 ...

  2. 活动可视化怎么做?看京东乐高架构设计

    作者:王光辉.杜启超 部门:京东科技业务中台团队 一.前言 低代码,可视化搭建不是一个新鲜的命题了.业界也有非常多的实践和尝试.尤其是C端业务比较多的场景下,很多单页的H5如需求告知.产品介绍.营销活 ...

  3. 分布式系统架构设计36式 – 第0式 - 设计总决

    动机 在"不易.简易.变易"这三个范畴里,技术是属于"变易"范畴的,其千变万化:"方法论"是属于"简易"范畴的,其具有领 ...

  4. 工行“去O”数据库选型与分布式架构设计

    魏亚东 工商银行软件开发中心经理 中国工商银行软件开发中心三级经理,资深架构师.杭州研发部数据库专家牵头人和开发中心安全团队成员,负责技术管理.数据库和安全相关工作. 2009年加入中国工商银行软件开 ...

  5. 微服务架构统一安全认证设计与实践

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 当企业应用系统逐 ...

  6. 统一监控报警平台的架构设计思路分享

    本文以全局视角,从一个监控系统的设计开始,为我们展示了一个高性能的监控系统应该如何架构和分层.细观现在的服务架构设计,越来越强调模块化.异步处理.分层设计.低耦合.高内聚等等.今天的文章为我们展示了一 ...

  7. 架构设计案例分析-高速公路收费运营管理平台

    本文旨在通过对某省高速公路联网收费运营管理平台的架构设计过程进行案例分析,描述架构设计的决策过程. 1.业务背景 某省的高速公路分为近百个路段,不同的路段归属不同的公司建设与运营,造成了车辆在跨越不同 ...

  8. NVIDIA Turing Architecture架构设计(上)

    NVIDIA Turing Architecture架构设计(上) 在游戏市场持续增长和对更好的 3D 图形的永不满足的需求的推动下, NVIDIA ®已经将 GPU 发展成为许多计算密集型应用的世界 ...

  9. 你必须了解的微服务架构设计的10个要点!

    近来,几乎人人都在谈论微服务.微服务之所以火热也是因为相对之前的应用开发方式有很多优点,如更灵活.更能适应现在需求快速变更的大环境等.本文将介绍微服务架构设计中的一些要点. 微服务架构设计时有哪些要点 ...

最新文章

  1. YYCache 源码分析(一)
  2. pytorch C++部署模型 ONNX tensorRT
  3. Python学习笔记:Day14 完成Web App
  4. BZOJ4516: [Sdoi2016]生成魔咒
  5. 腾讯云ubuntu18安装图形化界面
  6. hive mysql类型,(二)Hive数据类型、数据定义、数据操作和查询
  7. android 生成 资源文件,SVG-Android开源库——SVG生成Vector资源文件的编辑预览工具...
  8. 资源下载| 机器学习经典书籍《统计学习方法》(Python3.6)代码实现(及课件)
  9. Android调用系统照相机
  10. 使用gdb调试运行时的程序小技巧 -转
  11. VS2012在一个解决方案中添加多个项目(工程)
  12. 广义线性模型总结(GLM)
  13. .NET配置文件的10大安全漏洞
  14. xshell远程登录工具的星号密码查看方法
  15. 什么是推荐系统?推荐系统类型、用例和应用
  16. html5拳皇代码,拳皇.html
  17. 树莓派2022-04-04bullseye版本安装
  18. Python 采集87个手绘风格PPT模板
  19. 《OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks》翻译
  20. 输出小数点后第n位数字

热门文章

  1. strncpy函数,字符串拷贝函数(长度受限制)
  2. Adobe PDF 虚拟打印失败的解决方案
  3. 华为P50/P50Pro怎么解锁HAUWEI P50pro屏幕锁开机锁激活设备锁了应该如何强制解除鸿蒙系统刷机解锁方法流程步骤不开机跳过锁屏移除锁定进系统方法经验
  4. 【Python3.6爬虫学习记录】(九)模拟登陆QQ空间爬取好友所有留言并制作词云
  5. C++获取注册表IE浏览器历史记录
  6. 全省计算机等级考试中级和2级,计算机中级考试和计算机2级考试有什么区别?
  7. 110款有趣的开源游戏和应用
  8. 【java】代理模式简单实现
  9. C语言变量和数据类型及数据长度
  10. Iframe嵌套页面报404错误