在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
http://www.sohu.com/a/119466814_494947 作者:谢刚,京东商城架构师,负责京东分类列表、凤凰等系统的架构开发工作;之前在搜狐视频负责UGC视频架构开发工作。 ***招聘:京东列表页目前有Java、Golang、Lua(OpenResty)、数据挖掘等职位,欢迎投简历到[email protected],期待与您的合作*** 承接上篇《》。 分类列表入口 分类列表入口,可以通过京东首页首屏左侧导航进入,是用户购买商品的几大入口之一。 分类列表,展示各个分类的商品,有综合排序、价格排序、销量排序、上架时间排序、图书还有出版时间排序。可以按照品牌、价格和各种扩展属性筛选出想要的商品。下图以空调列表为例。 分类列表特点
旧架构 旧架构,前端是用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倍以上。 =======京东网站招聘======= 京东列表页目前有Java、Golang、Lua(OpenResty)、数据挖掘等职位,欢迎投简历到[email protected],期待与您的合作~ ======个人公众号推荐====== 春天的旁边,springside作者,唯品会一线老司机,by 江南白衣。 =======活动友情推荐======= 12月9-12日,由msup主办的第五届TOP100summit活动要开始了,将有100个软件研发设计的案例在会上分享,欢迎有兴趣的朋友参加! 点击「阅读原文」进入报名页面选择「体验票」提交相关信息,并输入专属优惠码 kaitao,就有机会免费获得大会2天(12月9-10号)的体验票。快来参与吧! |
请发表评论