端到端性能体验稳定性优化常见方案

news2025/1/5 8:19:55

引言

        作为一个服务端程序员,在一个领域深耕几年之后,会发现学习的新东西越来越少,这时候怎么办呢?就需要一边深耕,一边增加对相关横向团队的了解和交流,会发现原来端到端链路还有非常广阔的空间等着你去成长。

        基于过去几年负责过的亿级用户千万级日活的用户系统、亿级用户业务推送系统,加上跟客户端、前端、服务端、中间件团队的一些技术合作,这里总结一下常见的端到端性能&体验&稳定性的优化方案。

前端

1. 通用手段

  • 资源处理
    • 拆包:拆bundle。利用webpack4 dynamic import机制,根据页面入口业务不同,引入不同bundle
    • 大图片资源:WebP压缩,不用GIF用Lottie
    • 小图片资源:矢量图,例如iconfont
    • 资源加载控制:业务js尽量异步,异步尽可能用原生 async,容器自带优化
  • 业务逻辑
    • 首屏请求拆分
    • 请求合并:减少同步多次请求,FaaS层请求合并
  • 渲染性能
  • 情绪安抚
    • loading动画
    • 骨架屏
    • 快照:HTML快照,接口请求后,保存上次访问的HTML在storage中,下次进入优先取storage中的HTML资源展示

2. H5

  • 端内手段
    • 离线包
    • 数据预加载:数据提前推送到客户端,前端在加载JS资源的同时直接从客户端缓存中取数据
  • 边缘渲染:CDN
  • 性能监控

3. 小程序

  • 客户端预置包、预加载、预解析
  • 包大小精简
    • 分包:主包仅保留首页,其他页面逻辑放到子包
    • 代码精简:冗余代码、npm包依赖、代码合并
    • 插件化:业务源码组件(考勤、待办等)改插件化,异步加载
  • 首屏数据优化:非首屏(下滑、分Tab内容)懒加载或延迟加载
  • 代码重构,去除废弃逻辑、不合理调用等
  • 可交互快照技术
    • 小程序首页保存为图片,即快照。二次打开小程序 -> 展示快照(最上层)-> 启动小程序 -> 启动完成 -> 隐藏快照 -> 保存新快照
    • 针对不同区块计算每一个dom的位置及对应link,客户端记录不同坐标对应的link,结合不同位置的优先级算法实现图片可交互

服务端

服务端的性能优化会按照工作台历史上做过性能优化效果大小从高到低梳理

1. 架构优化:设计模式策略+责任链

主链路架构优化。对于大多数基于DDD建模出来的产品,必须掌握的一个设计模式就是策略模式(通常结合工厂模式一起使用)。对于主页或门户类的加载,常常用到的一个设计模式则是责任链模式。好的设计模式+恰到好处的使用=延缓架构腐化,防止性能快速下跌。
策略模式:根据入参组织信息+工作台Id+页面Id => 命中指定策略(标准工作台、自定义工作台、预览模式)
责任链:工作台的加载总体抽象为统一责任链 => 配置获取、权限校验、schema获取、动态布局、组件加载、页面样式适配、动态组件

2. 并发

工作台千万DAU流量,QPS高峰期约2W。4C8G机器不到200台。平均RT接近200ms。通过升级责任链从串行计算到并行计算,RT优化到近100ms。
核心优化思路:

3. 懒加载

页面、组件计算过程中依赖非常多的填充资源,例如组织信息、各种应用信息、用户信息、可见性信息等等,但由于不同类型工作台、不同schema的工作台上的组件内容不一样,所依赖的填充资源也不一样,这些不一样的地方往往要到某个组件的计算逻辑中才知道是否需要。因此可考虑Context+懒加载,需要时才加载。一处加载,处处可用。

4. 依赖限制

页面加载涉及依赖RPC接口超30个,如果每个IO超时限制都允许达到500ms,那基本要不了几个接口超时,整体就超时了。因此对于非核心依赖的超时可以分策略限制得低一些,例如50ms

5. 缓存

  • 前端缓存:针对组织+个人分别保持version,无写操作时,version不变,则前端存在最新缓存的场景下,可直接使用前端缓存
  • 服务端非多变核心依赖、高耗时依赖,使用内存缓存,可考虑本地缓存。注意缓存一致性问题、批量缓存获取问题、缓存击穿问题等
  • 持久化缓存:最近使用等

6. 降级

  • 高峰期,针对非首次访问流量进行降级,直接返回使用前端端缓存,保障首次访问流量正常高效加载
  • 平滑降级恢复,从降级恢复到非降级状态时,考虑平滑恢复,例如百分比逐步恢复,防止脉冲流量
  • 弱依赖直接降级

7. 预加载

  • 超99.9的场景需要使用的数据,例如配置类数据,直接预加载,后续直接使用。不要每用一处都请求一次
  • 部分可以合并批量预加载的场景,不要每一处独立查询
  • 预加载注意可能存在数据过期的极端场景,预加载最好少用于写操作场景
8. 异步化
可解耦的,异步化处理,削峰填谷,延迟处理。注意幂等保障,防止无限消费。注意数据一致性。
9. 推拉结合+边缘计算
有些可提前推送到客户端的非多变数据,可提前推送,减少拉取时的计算量,适合实时性要求高,或读多写少的场景。前端/客户端针对拉取到的数据跟提前推送的数据合并后进行展示。
在耗电量、流量消耗可控等前提下,使用客户端作为边缘计算的设备,而不是全部靠服务端中心式的计算,往往有奇效。
注意推送数据的过期和失效问题,数据一致性、多端一致性问题。

10. 代码规范

遵守阿里巴巴Java代码规范,可以避免很多常见问题
  • 防止循环IO,特别是底层的rpc
  • SQL命中索引,减少回表查询
  • 大数据量分页使用游标,而不是limit
  • ……

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

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

相关文章

windows11安装软件时选择文件路径只有桌面及子文件夹怎么解决方法

现象:当桌面文件夹、文件总数超过一定数量时(具体个数不详,个人猜测可能跟系统架构或内存有关)点击应用程序中“浏览”按钮时,只能看到桌面文件夹,其他盘符看不到。一个巨硬愚蠢的bug。定期清理下桌面吧,习惯下载到桌面…

SpringCloud源码-openFeign

LoadBalancer默认只有nacos服务发现器 openFeign与springcloud loadbalancer的结合点 openFeign通过spring cloud loadbalancer进行负载均衡,spring cloud loadbalancer通过discovery client获取nacos的机器列表,然后底层进行负载均衡。

开源架构中的数据库选择优化版

上一篇文章推荐: 开源架构学习指南:文档与资源的智慧锦囊(New) 我管理的社区推荐:【青云交社区】和【架构师社区】 推荐技术圈福利社群:点击快速加入 开源架构中的数据库选择优化版 一、引言二、关系型开源…

Listwise 排序之 LambdaRank:最大化 NDCG 的秘诀

Listwise系列相关文章(置顶) 1.Listwise 模型时间线梳理 2.Listwise 排序之 LambdaRank:最大化 NDCG 的秘诀 引言 LambdaRank 是一种用于排序学习(Learning to Rank, LTR)的模型,特别适用于推荐系统和信息…

汉化SecureCRT9.1

我个人觉得,SecureCRT是最好用的ssh远程工具软件,但是这个软件没有中文版本,我这种英文水平糟糕的人用起来,略有不便,因为一直没有在网上找到合适的汉化版本,于是有自己做一个汉化版本的计划。 前几日&…

我在广州学 Mysql 系列——插入、更新与删除数据详解以及实例

ℹ️大家好,我是练小杰,今天是2024年12月30号,明天就是2024最后一天了!! 本文将讲述MYSQL数据库的插入,更新以及删除数据~~ 复习:👉【有关Mysql数据库的单表,多表查询的练…

HarmonyOS Next ArkUI ListListItem笔记

学习目标: List和ListItem的使用 学习内容: import { NewsInfo, newsInfoList } from ../viewmodel/NewsInfoclass DividerTmp {strokeWidth: Length 1startMargin: Length 60endMargin: Length 10color: ResourceColor #ffe9f0f0constructor(str…

机器人C++开源库The Robotics Library (RL)使用手册(四)

建立自己的机器人3D模型和运动学模型 这里以国产机器人天机TR8为例,使用最普遍的DH运动学模型,结合RL所需的描述文件,进行生成。 最终,需要的有两个文件,一个是.wrl三维模型描述文件;一个是.xml运动学模型描述文件。 1、通过STEP/STP三维文件生成wrl三维文件 机器人的…

游戏引擎学习第70天

这一节没讲什么主要是关于接下来要干的任务 开发过程概览 我们正在进行最后的总结,并计划接下来的步骤。目前的目标是创建一个包含所有必要组件的游戏引擎原型版本,目的是让这些部分能够协同工作并展现预期效果。通过这一过程,可以实验和探…

Android笔试面试题AI答之Android基础(8)

Android入门请看《Android应用开发项目式教程》,视频、源码、答疑,手把手教 文章目录 1.Android新建工程需要注意的地方有哪些?**1. 选择合适的项目模板****2. 配置项目基本信息****3. 选择最低 SDK 版本****4. 配置构建工具****5. 选择编程…

传统听写与大模型听写比对

在快节奏的现代生活中,听写技能仍然是学习语言和提升认知能力的重要环节。然而,传统的听写练习往往枯燥乏味,且效率不高。现在,随着人工智能技术的发展,大模型听写工具的问世,为传统听写带来了革命性的变革…

赛博周刊·2024年度工具精选(画板二维码类)

一、画板类 1、Excalidraw 一款好用的手绘工具,无需注册,支持多人协作。GitHub项目地址:https://github.com/excalidraw/excalidraw。 2、 Floating Whiteboard 一个在线的网页白板工具。 3、BoardOS:在线实时白板协作系统 一…

论文研读:Text2Video-Zero 无需微调,仅改动<文生图模型>推理函数实现文生视频(Arxiv 2023-03-23)

论文名:Text2Video-Zero: Text-to-Image Diffusion Models are Zero-Shot Video Generators 1. 摘要 1.1 方法总结 通过潜空间插值, 实现动作连续帧。 以第一帧为锚定,替换原模型的self-attention,改为cross-attention 实现 保证图片整体场…

Spring自动化创建脚本-解放繁琐的初始化配置!!!(自动化SSM整合)

一、实现功能(原创,转载请告知) 1.自动配置pom配置文件 2.自动识别数据库及数据表,创建Entity、Dao、Service、Controller等 3.自动创建database.properties、mybatis-config.xml等数据库文件 4.自动创建spring-dao.xml spring-mvc.xml …

Unity3D仿星露谷物语开发12之创建道具列表

1、目标 道具是游戏的核心部分,道具包括你可以拾取的东西,你可以使用的工具和你能种的东西等。 本节就是创建道具的信息类。同时了解ScriptableObject类的使用。 2、创建道具枚举类 修改Assets -> Scripts -> Enums.cs脚本, 新增如…

华为配置 之 RIP

简介: RIP(路由信息协议)是一种广泛使用的内部网关协议,基于距离向量算法来决定路径。它通过向全网广播路由控制信息来动态交换网络拓扑信息,从而计算出最佳路由路径。RIP易于配置和理解,非常适用于小型网络…

使用new String(“yupi”)语句在Java中会创建多少个对象?

在 Java 编程中,字符串的处理是一个常见且重要的部分。理解字符串对象的创建和内存管理对于编写高效和优化的代码至关重要。当我们在 Java 中使用 new String("yupi") 语句时,实际上会涉及到多个对象的创建。本文将详细解释这一过程&#xff0…

vue使用el-select下拉框自定义复选框

在 Vue 开发中,高效且美观的组件能极大地提升用户体验和开发效率。在vue中使用elementplus 的 el-select下拉框实现了一个自定义的多选下拉框组件。 一、代码功能概述 这段代码创建了一个可多选的下拉框组件,通过el-select和el-checkbox-group结合的方…

Python基于EasyOCR进行路灯控制箱图像文本识别项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 随着城市化进程的加快,智能城市建设成为了现代社会发展的重要方向。路灯作为城市基础设…

TDengine 新功能 VARBINARY 数据类型

1. 背景 VARBINARY 数据类型用于存储二进制数据,与 MySQL 中的 VARBINARY 数据类型功能相同,VARBINARY 数据类型长度可变,在创建表时指定最大字节长度,使用进按需分配存储,但不能超过建表时指定的最大值。 2. 功能说明…