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


任何技术上的变动都要极度谨慎 , 不断的进行灰度测试 , 我们是从一台机器逐步灰度到一个set , 再扩散到一个渠道 , 最后全量 , 并且具备实时的异常数据埋点能力 , 及时发现灰度过程中问题 , 一旦发现问题要有开关能实时降级 。
Lua语言对于很多团队都使用过程中都遇到各种问题 , 今年双11的总结会上也有团队分享大促期间lua死锁问题 , 我们这里遇到的一个场景是zk的配置数据同步到lua时一定概率出现死锁 。
原因: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. 数据异构 , 减少强依赖

推荐阅读