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

news2024/11/15 13:46:39

在抖音亿级日活流量的情况下,每天收到的用户反馈也是大量的,而用户反馈对于产品的发展与未来是至关重要的,因此用户体验管理平台(简称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.coloradmin.cn/o/1922595.html

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

相关文章

字体反爬之自动化通过字体文件生成映射字典

1、首先找到以.ttf结尾的字体文件,下载下来,以我的字体文件sfont.ttf为例 sont.ttf下载地址https://download.csdn.net/download/lingyingdon/89534953 目前只测试了.ttf文件。如果想使用woff字体文件,请自行测试 2、下载分割字体文件的软件…

从汇编层看64位程序运行——参数传递的底层实现

大纲 小于等于6个参数一个参数总结 两个参数总结 三个参数总结 四个参数总结 五个参数总结 六个参数总结 大于6个参数七个参数总结 在32位系统中,参数的传递主要依靠栈来进行。那么64位系统上,是否依旧符合这个规则呢?答案是“不是”。64位系…

Objective-C 自定义渐变色Slider

文章目录 一、前情概要二、具体实现 一、前情概要 系统提供UISlider,但在开发过程中经常需要自定义,本次需求内容是实现一个拥有渐变色的滑动条,且渐变色随着手指touch的位置不同改变区域,类似如下 可以使用CAGradientLayer实现渐…

【Linux】Linux操作系统

Linux基本指令 os概念与定位 本节内容: Linux操作系统讲解 os概念与定位 操作系统(Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序。总的来讲,操作系统是一款做软硬件管理的软件。 了解操作…

springBoot(若依)集成camunda

1、下图为项目结构 2、最外层 pom引入依赖 <properties><!--camunda 标明版本&#xff0c;注意要个自己的Spring 版本匹配&#xff0c;匹配关系自行查询官网--><camunda.version>7.18.0</camunda.version> </properties> 3、common模块引入依赖 …

安卓14中Zygote初始化流程及源码分析

文章目录 日志抓取结合日志与源码分析systemServer zygote创建时序图一般应用 zygote 创建时序图向 zygote socket 发送数据时序图 本文首发地址 https://h89.cn/archives/298.html 最新更新地址 https://gitee.com/chenjim/chenjimblog 本文主要结合日志和代码看安卓 14 中 Zy…

抗量子密码算法:保障未来信息安全的新盾牌

随着量子计算的迅猛发展&#xff0c;传统加密算法正面临着前所未有的挑战。量子计算机利用量子比特的特殊性质&#xff0c;能在极短时间内破解目前广泛使用的公钥加密体系&#xff0c;如RSA、ECC等。这使得我国及全球的信息安全体系遭受严重威胁。为了应对这一挑战&#xff0c;…

知识图谱入门笔记

自学参考&#xff1a; 视频&#xff1a;斯坦福CS520 | 知识图谱 最全知识图谱综述 详解知识图谱的构建全流程 知识图谱构建&#xff08;概念&#xff0c;工具&#xff0c;实例调研&#xff09; 一、基本概念 知识图谱&#xff08;Knowledge graph&#xff09;&#xff1a;由结…

基于LSTM的局部特征提取网络算法原理

目录 一、LSTM的基本原理与结构 1. LSTM的核心结构 2. LSTM的工作原理 二、基于LSTM的局部特征提取 1. 输入处理与序列表示 2. LSTM层处理与特征提取 3. 特征提取的优势与应用 三、实现细节与注意事项 1. 数据预处理 2. 网络结构与参数选择 3. 训练策略与正则化 4.…

Chapter 1:数据结构前言

在数字化的世界里&#xff0c;我们每天都在与数据打交道。然而&#xff0c;你是否曾想过&#xff0c;这些数据是如何被组织、存储和处理的&#xff1f;这就是数据结构的魅力所在。 数据结构&#xff0c;简单来说&#xff0c;就是数据的组织方式。它决定了我们如何高效地访问和操…

【游戏客户端】大话slg玩法架构(三)建筑控件

【游戏客户端】大话slg玩法架构&#xff08;三&#xff09;建筑控件 大家好&#xff0c;我是Lampard家杰~~ 今天我们继续给大家分享SLG玩法的实现架构&#xff0c;关于SLG玩法的介绍可以参考这篇上一篇文章&#xff1a;【游戏客户端】制作率土之滨Like玩法 PS&#xff1a;和之前…

JVM系列 | 垃圾收集算法

JVM系列 | 垃圾收集算法 文章目录 前言如何判断对象已"死"&#xff1f;引用计数法可达性分析算法可达性分析2.0版 | 引用的增强对象的消亡过程回收方法区主要回收目标&#xff1a;回收操作 垃圾收集算法分代收集理论 与 跨代引用假说分代收集理论跨带引用假说 垃圾收…

Oracle数据库加密与安全

Wallet简介&#xff1a; Oracle Wallet(即内部加密技术TDE( Transparent DataEncryption&#xff09; TDE是 Oracle10gR2中推出的一个新功能,使用时要保证Oracle版本是在10gR2或者以上 Wallet配置&#xff1a; 1.创建一个新目录&#xff0c;并指定为Wallet目录 /home/oracle…

论文翻译:Large Language Models for Education: A Survey and Outlook

https://arxiv.org/abs/2403.18105 目录 教育领域的大型语言模型&#xff1a;一项调查和展望摘要1. 引言2. 教育应用中的LLM2.1 概述2.2 学习辅助2.2.1 问题解决&#xff08;QS&#xff09; 2.2.2 错误纠正&#xff08;EC&#xff09;2.2.3 困惑助手&#xff08;CH&#xff09;…

ExcelToDB2:批量导入Excel到IBM DB2数据库的自动化工具

ExcelToDB2&#xff1a;批量导入Excel到IBM DB2数据库的自动化工具 简介 ExcelToDB2是一个可以批量导入Excel到IBM DB2数据库的自动化工具。支持将xls/xlsx/xlsm/xlsb/csv/txt/xml格式的Excel文件导入到IBM DB2等多种原生及国产数据库。自动化是其最大的特点&#xff0c;因为它…

Python爬虫教程第5篇-使用BeautifulSoup查找html元素几种常用方法

文章目录 简介find()和find_all()字符串通过id查找通过属性查找通过.方式查找通过CSS选择器查找通过xpath查找正则表达自定义方法总结 简介 上一篇详细的介绍了如何使用Beautiful Soup的使用方法&#xff0c;但是最常用的还是如何解析html元素&#xff0c;这里再汇总介绍下查询…

数据分析——Python网络爬虫(四){正则表达式}

爬虫库的使用 爬虫的步骤正则表达式正则表达式的流程正则表达式的使用括号的使用管道匹配问号匹配星号匹配加号匹配花括号匹配用点-星匹配所有字符跨行匹配findall方法其他常用字符匹配 例子正则表达式在线测试 爬虫的步骤 #mermaid-svg-zSQSbTxUEex051NQ {font-family:"t…

Web开发 —— 放大镜效果(HTML、CSS、JavaScript)

目录 一、需求描述 二、实现效果 三、完整代码 四、实现过程 1、HTML 页面结构 2、CSS 元素样式 3、JavaScript动态控制 &#xff08;1&#xff09;获取元素 &#xff08;2&#xff09;控制大图和遮罩层的显隐性 &#xff08;3&#xff09;遮罩层跟随鼠标移动 &…

【电脑应用技巧】如何寻找电脑应用的安装包华为电脑、平板和手机资源交换共享

电脑的初学者可能会直接用【百度】搜索电脑应用程序的安装包&#xff0c;但是这样找到的电脑应用程序安装包经常会被加入木马或者强制捆绑一些不需要的应用装入电脑。 今天告诉大家一个得到干净电脑应用程序安装包的方法&#xff0c;就是用【联想的应用商店】。联想电脑我是一点…

使用Lego进行证书的申请和更新

姊妹篇: 使用Let’s Encrypt 申请通配符证书 关于acme 协议 ACME是自动证书管理环境&#xff08;Automatic Certificate Management Environment&#xff09;的缩写&#xff0c;是一个由IETF&#xff08;Internet Engineering Task Force&#xff09;制定的协议标准&#xff0c…