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

引言

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

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

前端

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.mzph.cn/pingmian/65874.shtml

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

相关文章

【AndroidAPP】权限被拒绝:[android.permission.READ_EXTERNAL_STORAGE],USB设备访问权限系统报错

一、问题原因 1.安卓安全性变更 Android 12 的安全性变更,Google 引入了更严格的 PendingIntent 安全管理,强制要求开发者明确指定 PendingIntent 的可变性(Mutable)或不可变性(Immutable)。 但是&#xf…

C之(14)gcov覆盖率

C之(14)gcov覆盖率 Author: Once Day Date: 2024年12月30日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: C语言_Once-Day的博客-CSDN博客 前些天…

简易屏幕共享工具-基于WebSocket

前面写了两个简单的屏幕共享工具,不过那只是为了验证通过截屏的方式是否可行,因为通常手动截屏的频率很低,而对于视频来说它的帧率要求就很高了,至少要一秒30帧率左右。所以,经过实际的截屏工具验证,我了解…

UE5 Debug的一些心得

1、BUG粗略可分为两类: 一种是显性的,编译直接就通不过,必须马上解决。 第二种是隐性的,新功能完成后,编译成功顺利运行,洋洋自得,而问题隐藏在幕后,测试之后才逐渐发现有问题&…

Django多字段认证的实现

Django多字段认证 需求: django认证的检查用户是username,如果使用 username和 手机号验证登录。 重写: ModelBackend 类下的 authenticate 方法 # 在对应应用下创建 utils.py""" 修改Django认证类,为了实现 …

Paperlib(论文管理工具)

Paperlib 是一个简单好用的论文管理工具。软件接入各学科数据库用于匹配论文元数据,逐步为每一个学科(例如计算机科学,物理学等)定制化数据库组合提高检索精度。尤其是精准的会议论文元数据检索能力。还可以管理你的论文&#xff…

c# 2024/12/27 周五

6《详解类型、变量与对象》36 详解类型、变量与对象 _1_哔哩哔哩_bilibili

Formality:匹配(match)是如何进行的?

相关阅读Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 匹配点、对比点和逻辑锥 匹配指的是Formality工具尝试将参考设计中的每个匹配点与实现设计中的相应匹配点进行配对,这里的匹配点包括对比点(Compare Point…

OpenStack-Dashboard界面简单修改

OpenStack Dashboard界面替换图片 一、dashboard界面Logo的路径及文件 dashboard的Logo存放(在Controller节点)的路径: /usr/share/openstack-dashboard/openstack_dashboard/static/dashboard/img/涉及需要修改的文件(3个&…

分布式算法(五):初识ZAB协议

文章目录 一、什么是Zookeeper二、ZAB与Zookeeper的关系为什么Zookeeper不直接使用Paxos 三、ZAB简介1.名词解释提案(Proposal)事务(Transaction)原子广播(Atomic Broadcast) 2.集群角色领导者(…

Mybatis 01

JDBC回顾 select 语句 "select *from student" 演示: 驱动包 JDBC 的操作流程: 1. 创建数据库连接池 DataSource 2. 通过 DataSource 获取数据库连接 Connection 3. 编写要执⾏带 ? 占位符的 SQL 语句 4. 通过 Connection 及 SQL 创建…

tensorboard的界面参数与图像数据分析讲解

目录 1.基础概念: (a)精确率与召回率: (b)mAP: (c)边界框损失: (d)目标损失: (e)分类损失: (f):学习率: 2.设置部分(最右边部分): GENERAL(常规设置…

关于HarmonyOS Next中卡片的使用方法

关于Harmony OS中卡片的使用方法 在Harmony OS中,静态卡片是一种非常有用的组件,用于提供应用内功能组件的交互和信息展示。本文将详细介绍如何在Harmony OS中使用静态卡片以及相关的API接口。 1. 概述 静态卡片是Harmony OS中的一种交互组件&#xf…

《计算机网络A》单选题-复习题库解析-2

目录 51、下列关于以太网网卡地址特点的说法中,不正确的是( )。 52、当一个Web Browser向一个使用标准服务器端口的Web Server提出请求时,那么在服务返回的响应包中,所使用的源端口是( &#xff0…

软件工程期末大复习(三)

让我们来复习一下第三章的结构化分析与设计的内容,并做一些相关的题目。 3.1 概述 结构化分析与设计是一种系统开发方法,它强调将复杂问题分解成更小、更易于管理和解决的部分。这种方法基于结构化编程的原则,即通过将程序分解成模块来提高…

Linux总结之CentOS Stream 9安装mysql8.0实操安装成功记录

Linux总结之CentOS Stream 9安装mysql8.0实操安装成功记录 由于网上很多的mysql8.0安装教程都是老版本或者安装过程记录有问题,导致经常安装到一半需要删除重新安装。所以将成功的实操安装过程记录一下,方面后面查阅,大家还有问题的可以在此讨…

高等数学学习笔记 ☞ 无穷小与无穷大

1. 无穷小 1. 定义:若函数当或时的极限为零,那么称函数是当或时的无穷小。 备注: ①:无穷小描述的是自变量的变化过程中,函数值的变化趋势,绝不能认为无穷小是一个很小很小的数。 ②:说无穷小时…

KMP 2024 年总结,Kotlin 崛起的一年

2024 Google I/O 上正式官宣了 KMP(Kotlin Multiplatform)项目,它是 Google Workspace 团队的一项长期「投资」项目,由 JetBrains 开发维护和开源的项目,简单来说,JetBrains 主导,Google Worksp…

欧拉-伯努利梁自由波动的频散关系

梁和杆都是一维结构,但是梁的弯曲波比杆的纵波要复杂多。例如即使最简单的欧拉-伯努利(Euler-Bernoulli)梁的弯曲波也具有频散特征,且当梁的特征尺寸和弯曲波波长满足某个比值时,欧拉-伯努利梁不再适用,需要引入铁摩辛克(Timoshenko)梁模型。 考察某一欧拉-伯努利梁,长度…

【SpringBoot教程】搭建SpringBoot项目之编写pom.xml

🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 👏今天毛毛张分享的内容主要是Maven 中 pom 文件🆕,涵盖基本概念、标签属性、配置等内容 文章目录 1.前言🥭2.项目基本…