承接上篇《京东三级列表页持续架构优化—前端优化实践》。京东级列架构 分类列表入口 分类列表入口,表页可以通过京东首页首屏左侧导航进入,持续是优化用户购买商品的几大入口之一。 分类列表,最佳展示各个分类的实践商品,有综合排序、京东级列架构价格排序、表页销量排序、持续上架时间排序、优化图书还有出版时间排序。最佳可以按照品牌、实践价格和各种扩展属性筛选出想要的京东级列架构商品。下图以空调列表为例。表页 分类列表特点 旧架构 旧架构,前端是用nodejs做模板渲染,后端服务是调用搜索接口。旧架构缺点: 升级新架构 * 新架构设计目标 * 新架构 新架构功能模块如上图所示: 新架构线上流程如下图所示 新架构离线数据流如下图所示 其中: 详解各个模块 * 质量分计算 由于每个分类的商品非常多,个别分类达千万量级的SKU,而用户浏览的SKU有限,我们需要将用户最可能买商品排在前面;为每个分类的所有sku进行质量分计算,涉及到几十个指标(包括销量、评价、浏览、转化率等);根据质量分的高低进行排序;由于涉及数据量很大,所有计算都在大数据平台完成;将计算结果推送到JSS。 由于还有一些特殊规则,例如品牌穿插、店铺穿插、特殊排序等,这些规则的实现是通过worker实现,读取jss,并进行特殊规则处理。源码下载将处理后的数据推送到MYSQL。 * 异构服务 异构服务主要是异构过滤和展示需要的商品数据;调用外部各个接口,形成一张商品宽表。如下图所示: * 业务处理子系统 上图展示了列表各种筛选逻辑,排序逻辑。 业务处理子系统提供前端所需要的所有过滤筛选接口,以及展示数据。该系统采用golang开发,所有筛选数据都存在内存中,提高检索速度;展示的数据都放在jimdb中,目的减少占用内存大小,缩短golang的GC时间。下图展示了内存中存储的数据。 * 消息处理系统 该系统接收处理相关消息(商品变更,上下架,价格变更,库存变更),并实时更新到线上,如下图所示: * 页面展示子系统 页面展示子系统,采用Nginx+Lua实现,负责模板的渲染,如下图所示。 为了提高页面的渲染速度,有一部分页面采用异步渲染,例如:页面小图聚合的可以让js渲染小图;超过5个的扩展属性,让js异步渲染。页面需要的价格数据、库存数据、广告数据,采用异步加载;保证这些数据的实时性。 页面渲染优化: Golang+Lua(OpenResty)的应用 * Golang–遇到的坑 * 选择Lua(OpenResty) ** 模板渲染 使用的模板引擎https://github.com/bungle/lua-resty-template。Nginx配置如下所示。 模板如下所示。 ** 缓存 缓存: ** 异常处理 异常处理分为两层托底,保证每层报错,均可对异常进行处理,无5xx等错误,提高用户体验,第一层托底,展示各个分类首页的缓存;第二层托底,跳转京东首页。 Lua执行问题,通过nginx配置error_page,进入异常处理。接口响应问题,通过ngx.exec内部跳转,进入异常处理。 注:error_page默认只匹配一次,匹配多次需配置recursive_error_pageson; ngx.exec为内部跳转,类似于流水线,数据流动方向单一,无额外http请求。 新版性能 * 页面渲染性能 页面响应时间:模板渲染+业务筛选接口(go),平均在30ms左右,tp99在80ms以内,提高6倍以上;页面渲染(NGINX+LUA)TPS,在并发100时,16核单机在3500笔/秒,提高10倍左右。 * 业务筛选接口(GO)性能 业务筛选接口(GO):平均在10ms以内,tp99在50ms左右,响应时间提高6倍以上。 作者:谢刚,京东商城架构师,负责京东分类列表、凤凰等系统的架构开发工作;之前在搜狐视频负责UGC视频架构开发工作。 【本文来自专栏作者张开涛的微信公众号(开涛的博客),公众号id: kaitao-1234567】