当前位置: 首页 > 科技观察

静态应用数据架构高性能单页web应用

时间:2023-03-21 22:14:36 科技观察

在电商网站中,单页web是一种很常见的形式,比如首页、频道页、广告页等都是单页的页面应用。而这种页面是由模板+数据组成的。传统的构造方法一般是通过静态实现的。但是,这种方法的灵活性不是很好。比如页面模板的一部分发生变化,需要重新生成。因此,最好的实现方式是实时动态渲染,以支持模板的可变性。此外,还应考虑以下问题:1.动态模板渲染支持;2、数据和模板多版本:生产版、灰度版、预发布版;3、版本回滚问题,假设当前发布的生产版本出现问题,如何快速回滚到之前的版本;4、异常问题,假设渲染模板时遇到异常情况(比如获取Redis有问题),如何处理;5.灰度发布问题,比如砍20%给灰度版;6.发布前题,目的是在正式环境下测试数据和模板的正确性。整体架构的静态页面方案如下图所示:将生成的静态页面直接推送到相关服务器即可。使用这种方法应该考虑文件操作的原子性(即从旧版本切换到新版本时如何实现文件操作的原子性)。动态解决方案整体架构如下图所示,分为三大系统:CMS系统、控制系统和前端显示系统。CMS系统1、页面的模板和数据都可以在CMS系统中配置;1.1.模板在CMS系统中是动态维护的,即模板不是一个静态文件,而是存储在CMS中的一段数据,最终发布到“发布数据存储Redis”中,前端展示系统从Redis中获取模板进行渲染,使得前端展示系统更换模板后无需重启,纯动态维护模板数据;2、原始数据可存储在“元数据存储Mysql”中,比如频道页面一般需要:前端访问网址、分类、轮播图、产品底面数据等;这些数据按照相应的维度存储在CMS系统中;将里面的原始数据和模板数据拼装成聚合数据(JSON存储)并同步到“发布数据存储Redis”,以便前端展示系统获取并展示;这里提供三个发布按钮:正式版、灰度版、预发布版在。目前存在以下几个问题:1、用户访问http://channel.jd.com/fashion.html,如何定位到对应的聚合数据?我们可以将URL定义为CMS元数据中的KEY。如果没有URL,则使用ID作为KEY,或者自动生成一个URL。2、如何存储多个版本?使用Redis的Hash结构存储,KEY为URL(如http://channel.jd.com/fashion.html),字段按维度存储:正式版存储的是当前时间戳(这样前端系统就可以根据时间戳进行排序,得到最新版本),预发布版本使用“predeploy”作为字段,灰色版本使用“abVersion”作为字段,区分多个版本。3、灰度版如何控制?这是由控制系统的开关控制的;4.如何获取预发布版本?比如predeploy=true总是包含在url参数中,可以限制只在内网访问或者访问时带上访问密码,比如pwd=absdfedwqdqw。5.模板变更历史数据验证的问题?比如模板变了,但是用历史数据渲染模板会有问题,即模板必须兼容历史数据;这里的解决方案不存在这个问题,因为每次存储的是当时的模板快照,即数据快照和模板快照被推送到“发布数据存储Redis”。前端展示系统1、获取当前URL,以URL为KEY首先从本地“发布数据存储Redis”中获取数据;2、若无数据或异常,从主“发布数据存储Redis”获取数据;3.如果主要的“发布数据存储Redis”如果数据存储“Redis”也出现异常,会直接调用CMS系统暴露的API直接从元数据存储Mysql中获取数据进行处理。展示系统伪代码Java代码,即动态获取模板和数据,然后使用动态获取的模板和数据进行渲染。最新版模板或数据出现问题怎么办?从流程上可以避免:1.先发布预发布版本,测试人员验证没有问题后;2.然后发布灰度版本,在灰度CDN功能自动去掉的时候(也就是没有设置页面的缓存时间),发布验证就OK了;3、正式版发布;正式版发布后5分钟内不设置页面缓存,防止发布过程中遇到问题。问题,但问题版本已经对CDN上的所有用户造成问题。当然这个过程比较繁琐,可以根据自己的场景进行简化。控制系统控制系统用于版本降级和灰度发布。当然,这个功能可以在CMS系统中实现。版本降级:假设当前线上版本遇到问题,如果想快速切换回之前的版本,可以通过控制系统来实现。选择其中一个历史版本通知前端显示系统。使用URL和当前版本字段就可以了,这样前端展示系统就可以自动切换到选择的版本;问题修复后,删除降级配置,切换回最新版本。灰度发布:控制系统控制哪些URL需要灰度发布,以及灰度发布的比例。类似同版本降级,将相关数据推送到前端展示系统即可,不需要灰度发布时删除相关数据。数据和模板动态我们动态存储数据和模板,因此可以在CMS中更改数据和模板;实现了前后端开发人员的分离;前端开发人员进行CMS数据配置和模板开发,后端开发人员只进行系统维护。另外,由于模板是动态存储的,每次发布新模板时,无需重启前端展示系统,更好的解放了后端开发人员。模板和数据可以是一对多的关系,即一个模板可以被多个数据使用。假设模板发生变化,我们可以批量推送模板关联的数据。首先发布预发布版本,测试人员验证。如果验证没有问题,就可以发布正式版了。多版本机制我们将数据和模板分成多个版本后,可以实现:预发布版本:测试人员更容易在实际环境中进行验证;灰色版:只需简单的开关控制即可进行A/B测试;官方版本:存放多个历史官方版本。如果最新的官方版本出现问题,可以非常快速的切换回之前的版本。异常问题的担心之一是本机的“发布数据存储Redis”和主“发布数据存储Redis”都宕机了,所以我们直接调用CMS系统暴露的HTTP服务直接从中获取数据元数据存储Mysql。还有一种担心是获取到数据和模板,但是渲染模板错误,比如遇到500、503;解决方法是:使用上一版本的数据进行渲染。还有一个问题就是数据和模板都没有问题,但是由于一些疏忽导致渲染出来的页面乱七八糟或者部分区域空白;这个问题没有很好的解决办法;可以根据自己的场景库定义异常扫描,扫描当前版本,出现异常时向相关人员发出警告,并自动降级到之前的版本。【本文为专栏作家张凯涛原创文章,作者微信公众号:凯涛的博客(kaitao-1234567)】