ES 慢上游响应问题优化在用户体验场景中的实践

在抖音亿级日活流量的情况下,每天收到的用户反馈也是大量的,而用户反馈对于产品的发展与未来是至关重要的,因此用户体验管理平台(简称VoC)就应运而生,VoC 平台旨在通过技术平台化的方式,结合反馈驱动的机制,以产品化、数据化的手段从反馈中挖掘出对抖音系产品留存、增长或口碑提升的可能点,推动体验问题治理改进,提升产品体验。同时也为公司各业务线提供通用和定制化的体验数据总览、用户原声分析以及体验专项、实验专项等看板或专项管理能力。由其定位可知 VoC 平台需要具备实时大数据处理能力和高性能、高效能的指标计算能力,同时也需要保证足够的准确性与稳定性。

下面简要介绍本文优化实践涉及到 VoC 平台的主要功能,和在平台业务发展中产生的痛点问题的优化实践,由于篇幅有限本篇将主要对 ES 慢上游响应场景的优化实践进行介绍,下篇文章将主要介绍针对 ES 引擎局限性的优化实践及经过优化后整体的收益分析。

体验数据总览

体验数据总览主要是帮助运营、产品同学快速掌握反馈数据的整体情况。包括关键指标、反馈重点问题、全渠道反馈词频等重点模块。

  • 关键指标-反馈量级:快速掌握反馈数据量级;

  • 关键指标-反馈变化趋势:直观感受反馈趋势变化,初步定位原因;

  • 反馈重点问题:场景&问题维度掌握反馈,进一步深挖反馈量级变化的原因。

用户原声分析

用户原声分析主要是帮助运营、产品同学按照自己感兴趣的特定场景分析全渠道用户反馈并生成对应的用户画像分析,同时支持用户按照特定维度对比反馈变化趋势,细化分析维度,直击用户心声。其中,对比维度分为两种:一种是有固定数量、固定枚举值的,例如手机系统有 iOS、Android,这种对比维度的枚举数量有限且枚举值已知,趋势图展示会展示全部枚举值下聚合的趋势线;一种是数量、枚举值数量大于 10 或不固定的,例如 App 小版本号等,这种对比维度的枚举值无法预先掌握,趋势图展示仅展示均值 TOP 10 枚举的趋势线。

性能痛点

伴随着 VoC 平台上线以来的业务线横向拓宽、数据逐步积累到亿数量级以及分析能力拓展,平台所采用的 ES 搜索引擎逐渐暴漏出查询慢、OOM 等问题,严重影响了用户操作平台的使用体验。同时,VoC 对各业务线提供了一定范围内的标签整合能力,方便业务整合业务场景进行数据分析,但该能力承载在另外一个数据反馈和风控平台(SkyNet)中提供统一标签配置能力,由于历史遗留问题存在一定程度的性能问题,且由于标签是 VoC 平台相关数据统计的最基本条件,标签获取的慢响应会拖慢所有查询接口的响应。能否解决以上两个问题,是现阶段我们提升用户体验与维护平台口碑的关键。

痛点一:上游性能局限性

VoC 平台目前已完成公司大部分业务线的数据接入,为了能够保证平台数据的时效性和有效性,需要实时地对接公司多个平台获取相关信息。由于每个上游平台的复杂度以及请求承载能力不同,VoC 平台在频繁请求众多上游接口的过程中经常出现响应时间过长甚至超时的问题,严重地损害了平台自身的稳定性。

目前 VoC 上游请求响应最慢和稳定性最差的接口主要集中在数据反馈和风控平台(SkyNet)标签映射这一部分,这部分主要是提供整合业务原始标签便于业务进行指标看板分析的映射标签的能力,显然这种标签树融合配置、映射与反映射的功能会存在大量的递归、剪枝等复杂逻辑,所以这部分上游接口的响应速度很慢。同时,标签作为 VoC 平台的基础查询条件,上游接口的慢响应会影响每一个接口的响应速度,如何在有限的条件下降低上游接口响应慢带来的影响,是性能优化着重要考虑的问题。

目前 VoC 平台指标接口流程如下所示:

痛点二:ES 引擎局限性

Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,VoC 平台的用户反馈数据均通过 ES 进行存储与查询,而上文提到的 VoC 功能中反馈变化趋势、反馈重点问题、反馈趋势维度对比,本质上都是围绕在时间、标签或是其他一些数据筛选项维度上的 ES 聚合或嵌套聚合。同时,ES 提供的聚合是一种 Bucket 聚合算法,Bucket 聚合按照一定的规则,将文档分配到不同的桶中,达到分类的目的,Bucket 聚合支持嵌套,也就是在桶里再次分桶。然而,ES 为了保证自身在面对海量数据与复杂查询条件时也能够稳定的运行,针对 Bucket 聚合设置了 max_bucket_size 限制,一旦本次查询生成的桶数目超出了该限制,ES 会立刻终止本次聚合并抛出异常,以免桶数过多超出内存限制最终触发 OOM。

我们可以来计算这样一个场景,统计周期为 6 个月、小时时间粒度下的标签对比维度反馈量趋势中一共有多少个桶:仅按时间相关的限制我们可以得到 6 个月、小时粒度的点共有 6*30*24=4320个,标签如果按 100 个计算,我们需要 ES 提供的聚合桶数就是 43.2 万个,但是实际上目前我们 ES 集群限制的聚合桶数仅仅只有 2 万个、标签数目也远不止 100 个。这就意味着大时间区间、小时间粒度、多对比维度这三个条件,任意一个足够极端时,我们的接口都有可能出现查询慢、ES 触发 Bucket 超限甚至 OOM 的异常情况。

上游性能局限性

虽然我们没有办法改变上游的接口性能,但由于 VoC 平台所依赖的上游数据绝大多数是变动不频繁的,我们可以通过设计针对上游接口的缓存方案,来降低上游性能对 VoC 平台接口性能的影响。本文基于数据反馈和风控平台(SkyNet) 标签映射接口阐述缓存方案的设计。

优化措施一:按请求参数缓存

按请求参数缓存是 B/S 架构下服务端最为常用的一种缓存方案,考虑到上游性能问题,这里不仅要对 VoC 自身接口做缓存也要对上游接口的响应做缓存。在上文的痛点中提过,映射标签到原始标签的转换因为上游性能问题成为瓶颈,针对该问题添加缓存后的方案流程如下:

添加请求参数缓存后的标签映射转换效率得到一定程度提升,但是这个提升仅局限在高频使用场景,这个原因是:上游接口的请求参数是一个映射标签列表,而 VoC 平台是支持用户自由的选择标签来过滤数据查看分析的,所以这里的请求参数可能性无限多,当且仅当按照同样的标签过滤条件查看页面时,这个上游缓存才能生效,换句话说就是高频使用场景性能提升更为明显。如何提升低频使用场景的缓存覆盖是后续方案设计着重要解决的问题。

优化措施二:按标签维度缓存

针对请求参数可能性无限多的问题,我们没有办法将全部的可能性全部加到缓存中,重新审视标签映射转换流程可以发现,标签映射相关接口请求上游的目的是完成映射标签到原始标签的转换,用于后续 ES 查询请求的构建,这个过程中最细的粒度是一个映射标签到多个原始标签的映射,这个转换流程如下所示:

不难看出,当前流程每一次查询都将前端请求中的映射标签参数全部透传到上游请求中,多次请求中很容易出现同一映射标签,同一映射标签在上游中的重复计算会造成不必要的开销。同时映射标签数目目前是万数量级的,我们没有办法把所有标签的排列组合全部加入预缓存,但却可以将每一个映射标签加入预缓存。综上,标签维度的缓存可以进一步提升缓存的覆盖面积,优化后的转换流程如下所示:

  • 通过 Faas 定时异步刷新全量标签缓存,基本能够保证 VoC 平台全部接口大部分时间内都不会再请求上游,而是通过 Redis Pipeline 去获取缓存中已有的标签映射信息,仅在上游标签映射版本改动时才会调用上游获取最新的标签映射信息。

  • 处理待转换的映射标签时,先分类出其中缓存中已有与缓存中暂无的映射标签,仅将未命中缓存的部分作为请求参数请求上游,降低上游计算量,提升响应速度。

标签维度的缓存与预缓存逻辑,将每个接口都需要进行的上游请求,转化为 Faas 中异步进行的缓存刷新,提升了缓存对于低频使用场景的覆盖,极大地降低了上游响应慢带来的影响,大范围提升了 VoC 平台的接口响应速度。

最终方案总览

综上,针对数据反馈和风控平台(SkyNet)为例的上游性能局限性解决方案为:

  • 请求参数缓存:用户高频使用场景性能有保障;

  • 标签维度缓存:用户低频使用场景能够复用历史标签映射转换结果,尽可能降低低频场景对于上游的依赖;

  • 高频场景预缓存与刷新缓存:通过分析一段时间的埋点数据,对请求参数缓存进行了高频场景的预缓存,尽最大可能保证进入平台以及高频场景使用的第一感受,同时消除缓存失效引起的性能骤降;

  • 标签映射预缓存与刷新缓存:定期刷新全量标签映射,将 99% 时间的上游请求都收拢到 Faas 任务中异步执行,整体避免上游依赖。

收益分析

在 VoC 平台的关键指标中用户进入平台首先看到的就是关键指标中的两个指标:反馈总量和反馈变化趋势,这里的性能分析是屏蔽了请求参数缓存进行的,目的是在于测试非高频场景下的性能优化结果:

反馈总量接口响应随着时间周期的增大性能提升更为明显,且基本稳定在 3.2s 左右;反馈趋势接口性能优化接近 80%,提升显著,但是当时间周期增加到 6 个月时性能会发生劣化,推测和 Filters 聚合的过滤条件下沉有关,这一部分还需要在后面的实践中进一步分析确认。

第二个痛点问题针对 ES 引擎局限性的性能优化将在下篇继续为大家介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/45634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uni-app 保存号码到通讯录

1、 添加模块 2、添加权限 3、添加策略 Android: "permissionExternalStorage" : {"request" : "none","prompt" : "应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片…

房屋出租管理系统小程序需求分析及功能介绍

房屋租赁管理系统适用于写字楼、办公楼、厂区、园区、商城、公寓等商办商业不动产的租赁管理及租赁营销;提供资产管理,合同管理,租赁管理, 物业管理,门禁管理等一体化的运营管理平台,提高项目方管理运营效率…

电脑如何快速删除相同的文件?分享5款重复文件删除工具

您有没有发现最近电脑运行速度变慢了?启动时间变得更长,甚至完成简单任务也难以如常?这可能是因为重复文件堆积所致。我们发现,清理或移动这些重复的文件和文件夹可以产生惊人的效果。通过删除不必要的重复文件和垃圾文件&#xf…

从LeetCode215看排序算法

目录 LeetCode215 数组的第K个最大元素 ① 第一反应:java的内置排序Arrays.sort() ② 冒泡排序 ③归并排序(先分解再合并) ④快速排序(边分解边排序) ⑤堆排序 LeetCode215 数组的第K个最大元素 给定整数数组 nums…

ubuntu基于cmakelist的Qt工程,如何将图片打包进二进制程序

qt界面使用的图片打包进入二进制可执行程序,可以避免发布的软件,因为路径问题无法加载图片的问题。 以下步骤参考自百度AI. 步骤如下: 1.创建一个新的Qt资源文件(.qrc文件) 2.在*.qrc文件中添加图片路径 qrc文件使用…

LeetCode HOT100(四)字串

和为 K 的子数组(mid) 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 输入:nums [1,1,1], k 2 输出:2 解法1:前缀和Map 这…

(Vue+SpringBoot+elementUi+WangEditer)仿论坛项目

项目使用到的技术与库 1.前端 Vue2 elementUi Cookie WangEditer 2.后端 SpringBoot Mybatis-Plus 3.数据库 MySql 一、效果展示 1.1主页效果: 1.2 文章编辑页面: 1.3 成功发布文章 1.4 文章关键字搜索提示 1.5 文章查询结果展示 1.6 文章内容及交互展示…

linux怎么查看系统重启原因?LINUX系统不明原因重启解决步骤,在Linux中如何排查系统启动问题?

linux怎么查看系统重启原因?LINUX系统不明原因重启解决步骤,在Linux中如何排查系统启动问题? linux怎么查看系统重启原因,网上大部分总结的步骤如下: 查看系统日志:系统日志中存储了系统重启异常的情况及其…

TransT: 基于类型的多重嵌入表示用于知识图谱补全

1 引言 1.1 问题 仅仅依赖于三元组的结构化信息有其局限性,因为它们往往忽略了知识图谱中丰富的语义信息以及由这些语义信息所代表的先验知识。语义信息是指实体和关系的含义,比如“北京”是“中国”的首都,“苹果”是一种水果。先验知识则…

ESP32CAM物联网教学12

ESP32CAM物联网教学12 MicroPython 视频服务 小智希望能在MicroPython中实现摄像头的视频服务,就像官方示例程序CameraWebServer那样。 下载视频服务驱动库 小智通过上网搜索,发现相关的教学材料还不少,并且知道有人已经写出了视频服务的驱…

24/7/12总结

axios Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 get请求: <script>function…

【Linux网络】数据链路层【下】{MAC/MTU/ARP/ICMP/NAT/PING/代理服务器原理}

文章目录 1.逐步深入数据链路层1.1MAC帧1.2由集线器到交换机1.3认识MTU 2.ARP 地址解析协议/RARP逆地址解析协议3.DNS(Domain Name System)域名从输入url后到能看到网页 发生了什么【典中典】 4.ICMP协议&#xff1a;一个网络层协议有了TCP&#xff0c;为什么还要用ICMPICMP协议…

HSP_15章 Python_模板设计模式和oop进阶总结

P136 模板设计模式 1. 设计模式简介 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式 设计模式就像是经典的棋谱&#xff0c;不同的棋局&#xff0c;我们用不同的棋谱&#xff0c;免去我们自己再思考和摸索 2. 模板设计模式 基本…

【面试八股总结】单例模式实现详解

一、基本概念 单例设计模式是⼀种确保⼀个类只有⼀个实例&#xff0c;并提供⼀个全局访问点来访问该实例的创建模式。 关键概念&#xff1a; 一个私有构造函数&#xff1a;确保只能单例类自己创建实例一个私有静态变量&#xff1a;确保只有一个实例&#xff0c;私有静态变量用…

4-4 词嵌入技术(word2vec)

4-4 词嵌入技术&#xff08;word2vec&#xff09; 词嵌入技术&#xff08;word2vec&#xff09;是自然语言处理&#xff08;NLP&#xff09;中的一种关键技术&#xff0c;通过将词语映射到低维向量空间中&#xff0c;使得计算机能够理解和处理语言中的语义信息。词嵌入不仅可以…

【性能测试】第一节.性能测试基础

文章目录 前言一、性能测试概述二、常见的性能测试指标 2.1 并发 2.2 响应时间 2.3 事务 2.4 点击率 2.5 吞吐量 2.6 资源利用率三、性能测试的分类 3.1 一般性能测试 3.2 负载测试 3.3 压力测试 3.4 稳定性测试总结 前言 一…

CAS详解

文章目录 CAS使用示例Unsafe类实现原理CAS问题 CAS CAS全称为Compare and Swap被译为比较并交换&#xff0c;是一种无锁算法。用于实现并发编程中的原子操作。CAS操作检查某个变量是否与预期的值相同&#xff0c;如果相同则将其更新为新值。CAS操作是原子的&#xff0c;这意味…

【错题集-编程题】栈和排序(栈 + 贪心)

牛客对于题目连接&#xff1a;栈和排序_牛客题霸_牛客网 (nowcoder.com) 一、分析题目 每次尽可能的先让当前需要的最大值弹出去。 二、代码 // 修改后的代码 class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方…

【2024_CUMCM】Matlab快速入门

目录 常识 disp and input 字符串合并 sum 提取矩阵指定位置的元素 指定行列 指定行or指定列&#xff08;返回行/列向量&#xff09; 指定某些行 指定全部元素&#xff0c;按列拼接 size repmat 矩阵的运算 基本运算 形状相同的矩阵运算 每个元素同时和常数相乘或相…

C++相关概念和易错语法(19)(继承规则、继承下的构造和析构、函数隐藏)

1.继承规则 继承的本质是复用&#xff0c;是结构上的继承而不是内容上的继承&#xff0c;近似于在子类中声明了父类的成员变量。 &#xff08;1&#xff09;写法&#xff1a;class student : public person 派生类&#xff08;子类&#xff09;&#xff0c;继承方式&…