首页 文章 精选 留言 我的

精选列表

搜索[逻辑模型],共10006篇文章
优秀的个人博客,低调大师

大促削峰实战:评价QPS降低85%的背后逻辑

一、背景 京东APP商品详情页展示的评价数据通过单独请求评价接口获取,与商详模块流量近乎1:1,需要共同应对秒杀等海量流量的冲击,存在突发流量风险。经过对用户操作行为和评价埋点信息分析,评价调用与商详流量解耦可行,预期收益显著。为此,评价与商详模块研发人员组成虚拟攻坚小组,推进解耦方案实施。 如图所示,商品详情页面中的评价、种草秀、问答等楼层的数据都是由评价独立接口提供。 随着商品详情页面的内容日益丰富,评价楼层通常不会在第一屏展示。因此,当用户首次进入商详页面且没有进行任何交互时,评价数据基本不会得到曝光。然而,评价接口会在请求商详接口之后无条件地被触发,除非对于热门的SKU使用缓存的评价数据进行刷新,从而避免额外的评价接口请求。因此,评价接口的请求数量和频率与商详接口基本保持1:1的比例。 为了更精确地优化这一情况,我们基于用户行为数据进行了深入分析。通过获取商详的PV数据和评价楼层曝光数据,希望能够更精准地匹配评价与商详的流量,从而降低不必要的评价接口请求,提高系统的效率和响应速度,达到大促削峰的作用。 以下是商祥PV和评价楼层曝光的数据对比: 无论是日常还是大促峰值期间,评价楼层的曝光量在商详曝光中仅占一小部分,这表明存在巨大的流量优化空间。因此,评价与商详流量解耦的可行性非常大,预期将带来显著的优化效果。 二、研发行动 1.技术方案制定 经过初步规划,提出以下方案:由于评价楼层通常不会在第一屏展示,我们计划在评价楼层的上一个楼层曝光时触发评价接口请求。这样可以延迟接口请求的时间,同时根据评价独立接口的TP99为50ms的现状,这种方案预计不会对用户体验造成影响。于是展开对关键楼层的分析: 经过分析,发现商品属性选择楼层、服务楼层、活动楼层、运费楼层,都可能因为商品属性不同存在不展示的可能。但是商品要送货,肯定要存在地址选择这个楼层,这样我们就暂定“送至XX”地址选择楼层。然鹅!经过与商详产研同学的详细沟通,我们发现 虚拟商品不需要配送!比如充值 这样就没有办法以固定楼层的方式来触发评价接口请求了! 既然以固定楼层为触发点的方案不可行,评价楼层又大概率不在第一屏展示,那说明评价楼层的曝光是离不开用户的滑动行为的,那就考虑结合用户的滑动行为去触发评价接口请求。 那么滑动距离设置为多少的时候触发请求最为合适,有一些商品的楼层较少,可能是在第一屏展示评价数据,也可能是稍微滑动一点就展示评价数据,所以暂时把触发滑动的距离设置为10个像素,即用户滑动行为产生即触发评价数据的请求,这里主要考虑2点: 用户产生滑动行为,即代表用户具有看到超出第一屏的意愿,根据用户习惯推断,除了商品详情信息以外,评价数据是用户购买决策的重要考虑点,即用户大概率是想看到评价数据; 刚一滑动就产生评价数据请求并在用户滑出评价楼层之前完成评价楼层渲染,对用户体验不会产生影响; 考虑后期要对滑动距离进行灵活修改实验以得到最优效果,触发请求的滑动的距离支持可配置; 但是不排除因为一些商品属性原因,评价数据在首屏发生曝光,所以,我们增加一个评价兜底楼层,当检测到评价兜底楼层曝光的时候,判断是否有请求过评价数据,如果没有,则触发评价数据请求。 到这里技术方案基本确定下来: 对于首屏展示评价楼层的商品,在兜底楼层曝光后,直接请求评价数据并刷新界面,这个我们在落地的过程中做了数据监控,这个数据量小到基本可以忽略; 对于非首屏展示评价楼层的商品,在用户滑动一定距离(10px,支持配置)的时候,触发评价数据请求,并刷线UI; 容灾:每个新上线的功能都能保证能降级回去,不管是实验控制,还是业务数据控制。所以我们在试金石建立了实验,实验开启的时候在端侧开启异步优化功能,同理实验关闭的时候关闭优化功能,另外根据实验逐渐放量我们也能分析优化效果的走向,从而判断出方案是否需要调整。 ok,下一步落地开发! 2.落地开发 按照以上方案经过商祥产品同学的内审和商祥研发同学的技术方案评审,最终跨2个版本完成开发。非常感谢商祥产品同学给出的产品意见、协助建立实验、切量以及商祥研发同学的技术方案补充! 3.经验沉淀 1. 按需加载2.落地问题记录 2.1 偶现UI刷新冲突造成滑动卡顿攻克 主图帧滑动10像素触发请求评价数据,接口数据回来在主线程更新商详楼层,导致主线程中断,以主图帧切换完成后延时500ms不在滑动主图帧时,触发请求评价数据,避免主线程阻塞造成卡顿; 2.2. 解决商详切换SKU,问答楼层不刷新 商详切换SKU,评价、问答、种草秀楼层首先用上次评价数据渲染楼层。由于问答楼层id被改为动态化楼层id,导致新评价数据回来后找不到问答楼层,无法刷新。通过商详切换SKU后,清除评价数据; 历经新老架构兼容验证、落地问题修复、线上逐步切量、用户客诉情况观察,在历经5个版本,在12.2.2 版本功能全量上线! 三、实践结论 所做的一切只为了这个Result。来吧,展示: 如上图:评价的QPS峰值,双11开门红同比618开门红约有83%的流量节省; 如上图:商详调用评价的QPS峰值,大促晚8的QPS流量同比618晚8点约有69%的流量节省; 在不影响用户体验的前提下,通过异步加载评价接口,实现评价接口大促峰值时刻QPS最高降低85% 作者:京东零售 孙巧巧 来源:京东云开发者社区 转载请注明来源

优秀的个人博客,低调大师

揭秘你处理数据的“底层逻辑”,详解公式引擎计算(一)

背景 身处信息时代之中,我们最能明显感受到的一点就是密集数据大量爆发,人们积累的数据也越来越多。这些庞杂的数据出现在一起,传统使用的很多数据记录、查询、汇总工具并不能满足人们的需求。更有效的将这些大量数据处理,让计算机听懂人类需要的数据效果,从而形成更加自动化、智能的数据处理方式。 为了处理这些海量数据,出现了各种大数据引擎、搜索引擎、计算引擎、3D引擎等,用以更好解决数据庞杂带来人工无法处理的问题。而作为其中比较基础的计算公式引擎,是在计算程序中负责对数据进行处理的核心部分。接下来我们将展开介绍计算引擎的基本原理、计算链和异步函数构成,并从计算公式引擎的基本概念出发,用我们的表格电子组件作为例子,为大家演示这些内容如何在JavaScript中实现。 公式引擎的计算原理 计算引擎负责解决数据来源的统计,数据的操作,数据的管理,并将合适的计算结果按照要求给予返回。针对数据处理的目的不同,需要返回的内容不同,也有很对多应不同的类别。 为了实现让计算机更好的识别我们需要的处理操作,需要进过编译的过程,将我们书写的语言翻译成机器可以识别的语言。 而整个编译阶段的流程,按照过程划分是按照下图进行的: 其中比较关键的两个环节是词法分析、语法分析的过程,在这两部分会将我们的输入逐渐拆分,转化为程序能够识别的内容。 输入内容后,编译器先对内容进行词法分析,在这一步编译器的任务是识别源程序中的单词是否有误,编译程序中实现这种功能的部分一般称为词法分析器。通常词法分析的输出是一个个单独的单词符号。 以JS为例,在这个过程中有三个主要部分:分析函数参数、分析变量声明、分析函数声明。语法分析阶段的目的是识别出源程序的语法结构(即语句或句子)是否错误,这一阶段通常可以发现语法的错误。在这个阶段中,编译器实际处理的是来自词法分析得出的单词符号。 而在计算公式引擎中我们处理数据的方式和编译原理中处理语言这一过程极度相似,从实际应用出发实现一个类似Excel的计算公式的计算公式引擎,我们可以采用的思路是从词法分析出发,将完整的长串公式语句拆分成小块内容,然后再进行语法分析,最后对生成语法结构树进行运算。接下来让我们一起看看细节如何实现。 公式引擎的实现细节 我们从公式计算开始为大家说明,公式计算即由一个公式字符串进行计算后,得出表达式结果。比如:公式“=1+10*11” 计算后得到结果111。电子计算机并不是人类,这样一个简单的表达式想要完全正确计算,最终变成我们需要的数据内容,并不是简单的我们看一眼后,口算就得到答案。实现这样类Excel表格计算的功能,需要通过词法分析,语法分析,语法结构树计算这几个过程。 1. 词法分析 以和中常用的公式进行说明。 首先我们进行词法分析,在这个过程中我们将公式字符拆成字符串数组,在Excel表格公式计算中,表达式的公式字符串中只包括:运算符、符号、字符串、数字、数组、引用、名称这几类。 名称:sum 运算符:( ) :/ % + 引用:A1 A11 B1 数字:100 2. 语法分析 词法分析完成之后,我们对词法分析的结果进行进一步语法分析。通常计算中语法分析可以采用表达式树或者堆栈(即逆波兰式)来处理。 这里我们先介绍表达式树的方法。 语法分析——表达式树 使用表达式树进行分析的过程,从一棵二叉树开始。首先我们将词法分析的结果按照优先级组成表达式树,表达式树的叶子结点就是操作数,内部节点是操作符。 在这个事例中,冒号的优先级最高,其次是括号,最后是除号。当这棵树形成之后,就离我们拿到最终的运算结果很接近了。 我们会采用递归调用的方式对这颗树进行运算,从根结点出发,到sum,一直向下递归,到A1:A11时,有了第一个结果,然后逐层返回计算结果。 这就完证的展示了如何实现一个公式计算。 语法分析——逆波兰算法 逆波兰算法是在语法分析阶段形成了一个堆栈(即逆波兰表达式),这个表达式的核心在于将普通我们是用的中缀表达式转换为后缀表达式。括号在运算的过程中只进行运算顺序的提示,但并不是实际参与计算的元素内容,所以在中缀转后缀的过程中就可以省略掉括号内容, 然后由计算机编写代码完成运算。 这里展示了一棵树转化成对应的逆波兰式的样子。 二叉树递归VS逆波兰算法 与一棵树递归计算相比,逆波兰式更符合数学计算的习惯。但实际在项目中处理这种公式计算的时候,到底哪一种更加能处理更复杂的情况呢? 让我们来看一个多层嵌套的公示内容: 这个公示的使用场景是SUMIFS函数多列求和,等价于下面这个内容: =SUMIFS($C:$C,$B:$B,$A1)+SUMIFS($D:$D,$B:$B,$A1)+…. 很明显上面的公式更加简单,采用二叉树递归的方式,只需要判断SUMIFS节点的父节点以及孩子结点内容,只需要短短一行代码就可以搞定这个多列求和。 但是如果是用逆波兰算法,代码一开始遇到SUM就开始计算,很难判定SUM此时要运行的内容其实在最内层括号之中。可以解决,但却并不是最简单的。 对比结果 与堆栈的方式相比,树的解法更容易扩展、增强,可以更加轻松应对复杂的公式。这在处理大量公式、复杂计算就是得天独厚的优势。 总结 在介绍完如何解析并进行公式计算的全过程之后,接下来我们会继续介绍在公式计算引擎中计算链和异步函数的相关内容。在处理复杂公式时,有向图如何求解,calcOnDemand解法又是什么,还有在前后端计算中异步函数的花式用法。 觉得不错点个赞再走吧~后续还会为大家带来更多有趣的内容~ 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册