京东CMS介绍CMS是内容管理系统(ContentManagementSystem),目的是快速进行网站建设或网络开发。对于京东网站部门来说,CMS的核心目的是快速开发和推出各种页面,比如各种垂直渠道页面。当你访问京东商城时,你会看到如下页面,比如点击“服装城”、“家电”等,会跳转到一个垂直的频道页面;其中很多页面的页面风格相似,所以非常适合使用CMS快速搭建,对我们来说CMS的核心目的就是数据和模板的统一管理,页面的统一发布,从而减少之前很多重复性的工作,京东CMS是2014年提出来的。经过两年多的完善,已发展成为集标准服务管理、标准组件服务、智能配送为一体的标准化导购运营体系,具有以下特点:1.快速建设、统一发布、统一架构;2.前后端分离,后端不再负责页面渲染,只提供高性能、可复用的API;3.移动页面支持;4.数据肛门的特点分析和智能交付;业务支撑场景:首页、频道页、竖版页、活动页、单品页、列表页及部分可维护服务的搭建。从基本功能和架构来看,可分为三个阶段:CMS1.0—虚拟分类系统CMS2.0—CMS系统CMS3.0—CMS-门户系统CMS1.0—虚拟分类系统虚拟分类系统是独立推广的产品和促销文字维护系统脱离具体的前端业务架构。虚拟分类接在哪条线上,需要根据自己的业务逻辑自主开发、维护、部署。说白了,虚拟分类系统提供了一些基础数据;那么比如我要搭建一个家电频道页面,我需要开发一个web项目,然后调用虚拟分类系统获取数据,然后进行模板渲染处理。因此,当时的虚拟分类系统只是一个基础的数据维护平台,无法实现信息的共享、重用和集约化管理。频道页面系统会五花八门,导致管理混乱,业绩参差不齐,事故多发。而且每个系统都需要独立配置,工作量大,资源占用大,无法快速响应业务需求。下图是当时不同业务系统的架构:可以看到,部分频道页面、活动页面使用nginx+tomcat,部分频道、垂直站使用nginx+php-fpm。它们与虚拟分类关系不大,一般遵循各业务层的规则。获取虚拟分类数据,独立上线、部署、维护,应用层直连mysql。如果mysql抗不住,就加一层memcache。CMS2.0——CMS系统Cms2.0总结了1.0的不足。从节约资源和控制成本的角度出发,统一导购单页服务,模板复用。之前虚拟分类系统的渠道也需要迁移到新系统。我们做了以下改动:1、CMS2.0的数据结构适合虚拟分类系统,便于新旧数据的兼容;2.升级架构,统一配置和发布流程;去掉memcacheasredis,做大量性能压测调php-fpm配置,单机TPS可达3000+;配置定时任务,保证redis数据实时;3、单点发布,一键预览,增强采购、营销、维护数据的移动性;4、单机闭环,单机闭环服务设计是CMS整体架构的核心部分,需要展示的内容在本地获取、打包、验证;5、模块化和动态数据类型的初始版本(CMS3.0将详述);架构图:与1.0相比,新版CMS可以使频道页面的开发周期缩短2~4周,大大提高了业务需求的响应速度;看起来更独立,更像一个整体,在容灾和规避风险方面都经过严格优化;同时,让采购和销售维护数据,更方便、更简单。未来,由于个性化的需求越来越大,大量的渠道服务需要开发者一个一个设置模板,这大大增加了开发者的工作强度。之前的模板复用方式已经不能满足业务需求。简单的数据模块需要手动绑定数据类型,增加开发成本。这个时候,我们就必须做出改变。CMS3.0—CMS-门户系统CMS2.0之后的痛点很多,所以我们也想在CMS3.0上解决这些问题:1.本质问题是快:快速支持和响应越来越多的竖版页面改版商务;2。前后端分离,页面渲染让前端实现,解放后端让后端做高层的事情;3、减少运营人员的工作量,系统简单易用,提高导购商品转化率;4.其他系统的支持,实现了CMS的集约化管理;5、兼容手机;6、站点管理、统一架构、容灾、高性能、水平扩展;通过两个版本的CMS系统的开发,我们发现CMS无非就是管理数据和模板。此外,还需要良好的预览和一键发布支持。传统的数据管理都是静态数据类型,但是我们设计了动态数据类型;此外,我们还构建了模板管理中心,将模板、楼层、组件、模块等概念抽象出来,实现更好的复用性。统一架构主要分为以下几个部分:CMS系统:CMS相关数据的统一管理,页面的生成和发布;数据工作者管理中心:调用第三方服务进行数据校验(如库存补货不足),调用CMS系统生成发布页面,发布到单点服务器;单点服务器:相关页面的单机闭环实现,即CMS发布的页面都会存储在这些单点服务器上;每个机房部署一台;页面定时更新Worker:定时将单点服务器的内容同步到静态应用服务器集群,并保存历史版本,出现问题时切换回之前的版本;静态应用服务器集群:静态后台实现,会存放相关的静态页面文件,当服务器挂掉时,会降级到集群;异步加载个性化服务:有些数据是静态页面无法存储的,比如价格/股票/推荐数据,此时可以通过异步加载这些数据来实现个性化服务;接入层Nginx:接入层Nginx负责请求的路由和服务的降级。主要思想1.引入动态数据类型;2、页面模板管理中心、模板、楼层、组件、模块设计,实现可复用性;3、使用组件实现前后端分离;4、动态服务与业务数据闭环;5.预览,一键发布,单点管理;6、H5版本直接搭建,原生版本API支持;7、大数据智能选品应用;动态数据类型所谓动态是指灵活扩展,无需上线或修改数据库字段即可支持自由扩展;这样做的好处是可以快速响应电子商务网站日益灵活多变的推广需求。比如促销词:目前常用的数据类型有文本链、小图文、商品池等。操作接口:动态数据类型数据结构:字段为json字符串,用于动态定义字段。使用组件实现前后端分离。使用动态数据类型定义数据后,您需要在模板中使用它。在我们的CMS系统中,分页面、模板、楼层、组件、模块。模块是数据类型的具体化,即具有数据的数据类型。组件由模块和HTML代码段(根据模块数据渲染的小模板)组成;floors是由一系列组件组成的,templates会引入多个floor,当然还有一些JS,CSS等,最后通过templates渲染出相应的页面。type是数据类型表,module是模块表,source是数据表。根据以上逻辑,我们通过数据类型获取数据模块,同时获取模块对应的商品数据(商品池)。有了这个组件,就可以彻底解放后端,将页面渲染工作完全交给前端开发,实现了前后端分离。即CMS研发只负责平台和基础数据(动态服务)的维护,业务人员维护模块,前端人员独立完成组件开发、模板设计、开发和发布。动态服务需要提供相关的API,用于跨业务线的资源复用和独立调用,如三级地址服务、类目服务、动态加载的数据(如热卖、今日推荐等)等。数据格式符合数据闭环原则。实现了Lua+redis架构,单机(16U)QPS可达200??00+。渠道业务数据闭环数据闭环,即数据的自我管理,或者说数据维护在自己的系统中,独立于任何其他系统,去依赖。这样获得的好处是,别人抖动与我无关。所以我们首先需要数据异构。数据异构是数据闭环的第一步,取依赖于系统的数据,根据自身业务需求进行存储。渠道业务对异构数据的需求主要分为三部分:产品基础信息、第三方数据、大数据。数据原子化处理,数据异构数据是原子数据,这样以后我们可以对这些数据进行再加工再处理,以应对不断变化的需求。我们有一个原子异构数据,虽然方便处理新的需求,但是正是因为第一个数据是原子的,所以会很散,前端读取的时候mget的性能不是很好,所以我们做它再次进行数据聚合。数据聚合就是将多个原子数据聚合成一个大的JSON数据,让前端展示只需要一次get。当然还要考虑系统架构,比如我们使用的Redis改造,Redis是单线程系统。我们需要部署更多的Redis支持更高的并发,并且存储的值要尽可能的小。容灾应用层容灾1、数据校验,CMS在页面预览中有一层严格的数据校验逻辑,比如数据格式、数据大小、敏感词等,保证页面生成100%没有问题。2.版本降级,静态页面有问题。除了页面本身的数据问题,内嵌的js和css的问题也会影响页面的显示。此时版本会降为前一天的正确版本;3.异步服务,异步数据容灾主要是监控服务状态和响应时间;可以通过隐藏该功能和切换服务器来实现降级访问;服务器容灾主要部署在多个机房,监控80端口,出现问题时可以自动切断流量级别。智能选品智能选品是服务于前台的流量运营,为采购、营销、运营人员提供运营支持,为每次到访提供最合适、最匹配的产品、品牌、促销活动。它根据用户行为推荐相关产品和活动。可分为群体特征和个体特征。组特征分为数据部分和规则部分两部分。数据部分是大数据平台异构的。当然,这个数据是海量的。我们选择热门TOP5000的数据进行异构性分析。规则部分是通过景致后台创建的。审核通过后触发MQ通过ES跑出相应的数据,然后频道页面动态服务系统对外提供json格式的http服务。前端业务以异步方式传递相关规则参数进行调用。智能选品,实现数字化、定制化、个性化、自动化和半自动化的内容运营。它可以模拟人脑的选择逻辑,以运营指标(GMV、订单转化率、点击量、毛利等)为导向,按地区和用户选择最匹配的内容。目前应用于京东超市、行业渠道、618大促主会场,带来比人工选品更好的转化效果,解放采购营销人员日常繁琐的操作,提升整体效率。rsync文件同步遇到的坑上文提到,我们的静态页面为了保持数据的一致性,从单点服务器通过rsync将静态文件同步到其他服务器,有时会莫名其妙的发现服务器负载爆满。分析问题后发现,如果定时任务脚本没有在指定时间内同步完成,crontab接下来会执行该脚本,会产生相同的rsync进程。按照这种状态,会长时间spawn出很多rsync进程,导致负载过高,甚至有的服务器会挂掉。这时候我们利用rsync的进程锁在目录下生成一个rsync.lock文件。crontab执行时,rsync会判断锁文件是否存在。如果存在,说明同步没有完成,不会执行rsync。数据必须是闭环的。别人的界面抖动,返回数据异常,影响前端显示,我们是无法忍受的。这就需要我们对每种情况一一进行检查。CMS小结目前,CMS支持、正在构建、使用CMSAPI的PC端和移动端页面约有上千个。这对CMS来说意义重大。随着业务需求的增加,也给我们带来了新的期待。接下来,我们将在可视化编辑、数据统计分析、关键词管理、商品下架预警等方面进行相关优化工作。作者简介:余林坤,2012年加入京东,网站移动研发部渠道业务技术总监。经验丰富,PHPer。【本文来自专栏作者张凯涛微信公众号(凯涛博客),公众号id:kaitao-1234567】
