京东详情页怎么做,京东详情页技术解密?( 二 )


原因:lua运行在nginx主线程中,但zk在nginx主线程外启动新的线程watch,当zk更新时通过这个新线程通知数据更新,这时我们在这个新的线程中直接调用lua代码,会有概率产生死锁 。
解决方案:在这个新线程中不直接调用lua代码,而是通过http协议直接进入nginx主线程更新配置数据 。
2. 数据静态化
单品页给APP提供的API重点包含两个,一个是静态接口,一个是动态接口数据,这里提到的静态化重点是针对静态接口数据,包含商品图片、基本信息、店铺商家信息、颜色尺码、延保…..等,去年双11期间,由于一些热点商品访问量过大,对jimdb集群单个分片的连接数和操作数都非常高,服务压力过大,整体集群服务性能变差,因此针对此进行了三级热点的优化:
CDN
众所周知,CDN本来就是替业务静态流量扛热点数据,但是上边提到后端有很多的适配工作,包括平台、网络环境、分辨率尺寸,要知道Android的分辨率五花八门,所以这种逻辑的话CDN很难发挥作用,因此今年针对这个逻辑做了优化,接口下发给APP的数据都是标准数据格式,同时会下发对应的适配规则给APP,由APP根据规则进行动态适配,极大地提升了缓存命中率,另外别忘了还要加上各种开关控制和数据的埋点监控,这也是APP开发的一个重要特征,APP发出去的版本如果出现各种未知情况将会是灾难,在618之前版本经过各种灰度最终还是顺利上线,在618期间发挥了重要作用,CDN的命中率达到60%以上,大促的0点开始大部分人还是集中在少数的爆款商品上 。这是第一层的保护 。
OpenResty(Nginx+Lua)层静态化
上边提到这一层重点还是数据静态化和防刷,您可能有疑问,CDN已经替挡住了大部分流量,为什么还需要这一层?CDN只是挡住了App的最新版本热点流量,还有M渠道是通过内网网关过来的,不经过CDN,以及App的老版本也是不走CDN,因此这一层主要依赖Nginx的共享缓存,分配100M的共享空间,在大促时命中率也可以到接近20% 。
JVM本地缓存
JVM的堆内存主要是针对商品的基本信息和特殊属性信息进行本地缓存,支持动态接口商品热点数据,依赖Guava组件实现的LRU缓存淘汰算法,大致5000个热点sku数据,数据量在5M左右,这是第三层的数据保护,大促时命中率在27%左右,另外强调一下,这里的java对象可动态配置成弱引用或者是软引用,一般建议采用弱引用,这样避免内存增长过快,导致频繁的GC 。
3. 数据异构,减少强依赖
数据异构带来的好处是可以减少一些基础服务的强依赖,之前老板提的一个目标就是基础服务挂了,上层业务还能很好的活着,但是京东这个数据体量来看成本是非常巨大的,因此APP单品页选择部分数据异构,减少基础服务接口的强依赖,主要是商品的基础数据、扩展属性信息、商品的详情数据,全量数据同步一次之后通过中间件JMQ进行增量的数据同步变更,存储使用的是缓存中间件jimdb(redis缓存) 。
4. 并发请求异步化
APP单品页前期属于野蛮发展,很多RPC的依赖极其不合理,比如依赖关系没有层次概念,超时时间设置超长、内外网接口同时依赖,造成任何的服务质量变差和网络抖动对整体API影响非常大,因此进行了一次SOA化改造,主要工作是把单品页系统从大网关分离出来,然后制定服务接入标准并进行改造,第三方面就是上游基础服务调用并行化,系统整体并发能力及稳定性得到了极大的提升 。
服务依赖的标准
依赖接口必须是内网服务,不允许依赖外网服务;
接口超时时间不超过100ms,并且除了一些核心数据,比如商品、价格、库存,其他都不进行重试;