分布式系统稳定性建设-性能优化篇

分布式系统稳定性建设-性能优化篇

系统稳定性建设是系统工程的核心内容之一。以下是一些重要的方面:

  1. 架构设计:

    • 采用模块化、松耦合的架构设计,以提高系统的可扩展性和可维护性。
    • 合理划分系统功能模块,降低单个模块的复杂度。
    • 定义清晰的接口和数据交换标准,确保各模块之间协调工作。
  2. 容错机制:

    • 建立完善的异常处理和容错机制,及时检测并隔离故障,防止故障传播。
    • 实现关键功能的冗余备份,提高系统的可用性。
    • 设计自动恢复和自修复机制,缩短系统故障的恢复时间。
  3. 性能优化:

    • 进行系统性能测试和瓶颈分析,确定系统的承载能力。
    • 优化关键模块的性能,提高系统的整体响应速度。
    • 采用缓存、异步处理等手段,缓解系统的瞬时压力。

性能优化

  • 在当今高并发、大流量的互联网环境中,分布式系统的性能和稳定性至关重要。本文将深入探讨分布式系统性能优化的关键策略和实践。

  • 性能优化可以从:代码优化、缓存、消息队列、并发、容量评估、压测、监控预警等来提高系统性能

代码优化

代码优化是提升系统性能的重要手段。

时间复杂度优化

  • 选择合适的算法和数据结构、避免嵌套循环、使用空间换时间策略

缓存优化

  • 想要提高服务的性能,基本会想到可以使用缓存来提高性能、应用服务的缓存一般就是存储一些使用频繁、但是存储空间占用不大,且基本不怎么变更的数据,或者作为多级缓存中的一级。
  • 缓存是提升系统性能的关键技术之一,通过减少数据访问延迟和降低后端存储压力,显著加快数据检索速度。在现代应用架构中,缓存不仅用于提升用户体验,也是实现高并发处理的基础。
  • 在分布式的场景在,应用服务缓存需要注意多节点缓存更新问题、一致性问题、LRU 缓存淘汰策略。

常见的缓存实现方式

  • 内存缓存:利用服务器的RAM来存储热点数据,提供快速的数据访问能力。常见的内存缓存实现包括Ehcache、Memcached等。
  • 分布式缓存:通过多台服务器共享缓存数据,解决了单机内存限制的问题,并提供了更好的扩展性和可用性。例如,Redis和Hazelcast是流行的分布式缓存解决方案。
  • 浏览器缓存:利用客户端的存储能力,减少网络传输的数据量,加快页面加载速度。通过设置合适的HTTP头信息,如Cache-Control和Expires,可以控制浏览器缓存的生命周期。
  • 内容分发网络(CDN):通过在网络边缘节点存储静态资源,使用户可以就近获取数据,从而减少延迟和带宽消耗。

缓存可能带来的问题

在使用缓存的过程中,需要考虑到一些相对极致的场景问题,比如:缓存的穿透、击穿、雪崩、等问题。

  • 缓存穿透: 是指查询一个一定不存在的数据时,由于缓存中没有此数据,每次查询都会落到数据库层。恶意攻击或程序bug可能会不断尝试不存在的数据查询,使得数据库承受巨大压力。
  • 缓存击穿: 特指对于那些热点key,在缓存失效的瞬间,大量并发请求同时到达,这些请求全部穿透缓存直达数据库,对数据库形成巨大压力。
  • 缓存雪崩: 是指在一段时间内,大量缓存在同一时刻集体失效,后续请求均直接打到数据库,可能导致数据库瞬间压力过大,服务不可用。
  • 大Key: 避免在redis中存储大量数据,导致内存大量使用,以及大key操作导致堵塞,分布式部署下节点内存使用不均,等问题。
  • Key命名: key长度不宜太长,尽可能简短且清晰表达用途,key需要能够根据业务领域、模块区分前缀,易于后续治理区分业务,尤其是对于redis集群共用的业务,后续做大key清理、redis拆分迁移。
  • 过期时间: 一般使用redis做热数据存储,也存在一些做持久化的场景,但是大部分都是需要对key设置过期时间,避免冷缓存,长期占用内存空间,资源被浪费。
  • 数据一致性: 数据DB更新,未能及时同步redis,导致数据不一致问题,对于一致性要求高的业务,需要重点考虑更新策略,保障一致性。
  • 缓存预热:缓存预热是在系统启动或低负载时段预先加载热点数据到缓存中,避免在高负载时发生缓存缺失。

消息队列

  • 在过往的业务开发过程中,经常会有一些功能需求,它需要在核心接口中拓展,但是非接口主要流程内容,同时可以接受一定延迟处理,我们往往会引入消息队列的使用,
  • 消息队列(如RabbitMQ、Kafka)在分布式系统中用于解耦服务,实现异步通信,提高系统的可扩展性和容错性。
    • 业务 解耦:生产者和消费者不需要直接知道对方的存在,降低了系统的耦合度。
    • 削峰填谷:帮助平滑系统负载,处理请求峰值,防止系统过载。
    • 异步处理:生产者无需等待消息处理完成即可继续工作,提高了系统响应速度和吞吐量。
    • 可扩展性和灵活性:容易添加或更改消费者,适应系统变化。

消息队列可能带来的问题

  • ACK 机制: 消息的执行需要确认被消费者成功消费后,才能从消息队列中移除。
  • 容错机制: 需要保障消费结果最终成功,通过异常兜底,或者消息的死信队列,保障异常情况下消息也能够兜底处理。
  • 结果幂等: 不能完全信任生产者的消息不重复,所以需要保障多次执行相同消息后结果幂等。
  • 执行时序/顺序: 当存在多个消费者同时消费的时候,需要考虑消费时序问题,可能后进的会被先执行,需要保障逻辑不被影响,如果存在影响,就需要考虑将消息进行分片路由到不同队列中,进行多消费者消费,提高吞吐的同时,也能保障相同标识的消息执行时序是正确的。

并发

在面对一些性能问题的时候,往往都是有一些耗时的操作(如I/O操作、网络请求、数据库访问等),除了将耗时的操作本身进行优化以外,我们还可以使用并发编程,golang 里面最常用的就是使用协程实现并发编程

在这里插入图片描述

并发可能带来的问题

  • 负载评估: 需要对并行操作的发起方和目标方服务器进行负载、服务器资源利用率的情况进行评估,在一些高并发、高峰期场景下,服务器本身负载就高,再对其并行改造,可能会事倍功半,可能会发展成压死骆驼的最后一根稻草,把服务搞崩溃了。

容量评估

根据应用的DAU、MAU,模块接口请求QPS、业务未来拓展方向、等信息,进行容量评估,作为设计的前置信息,衡量技术方案可行性。

容量评估包含这些内容:

  • QPS : 评估每秒请求数量,平均值、最高值,用于方案设计,以及性能压测。
  • DAU: 评估功能日访问量。
  • 数据量: 评估用户大概日生产数据量,用于用户表设计,如:是否纵向拆分列、横向分表、索引设计。
  • 资源利用: 评估数据存储占用多少空间、应用服务占用多少资源(cpu、mem、i/o、load、…),用于评估部署机器配置、是否扩容 。
  • 预测增长: 评估未来增长情况,用于方案设计考虑未来可拓展、可伸缩。

服务压测

压测需要制定一套标准,如:什么接口需要性能测试?性能测试需要关注哪些指标?以及指标的基线要求。

以下是一些压测标准,仅供参考

  • 是否 压测 : P0、P1核心业务接口、高 QPS 接口、无依赖第三方 / 内部耗时服务(算法/搜索…) 接口 。
  • 压测 配置: 最低48线程数,支持按倍数增长、压测时间、压测倍数、等。
  • 关注指标:请求数、QPS、TPS、CPU、MEM、I/O、Load、响应时间、错误数、错误率。
  • 判断依据: 性能测试基线 + 容量评估。
  • 单容器 压测 通过基线:
    • 响应时间 < 500ms
    • TPS > 500,QPS> 1000
    • 成功率 100%;
    • 在达到接口处理能力预期指标值时,数据库无慢查询出现;
    • 平均 CPU < 75%,平均负载小于 CPU 的核数
    • 趋势上在并发数增长情况下,TPS 跟随增长,响应时间 < 500ms。

监控预警

实现实时监控,当性能指标超出预设阈值时,系统应能自动发出告警,以便及时采取措施。

  • 高性能的系统通常需要实时、准确的性能监控。通过监控关键性能指标(如CPU使用率、内存占用、磁盘I/O、网络带宽、响应时间等),可以及时发现系统瓶颈和异常状况。这些数据是衡量系统是否运行在高性能状态的重要依据,也是调优的出发点。
  • 监控系统不仅要收集数据,还需要具备预警功能。当监控到的性能指标超过预设阈值时,预警系统会自动触发警告,通过邮件、短信、电话或集成的消息系统通知运维人员。这样可以在问题影响用户体验或造成系统故障之前,及时采取行动进行干预,保障系统的高性能运行。
  • 在可观测性的内容中,可以抽象出三大元素:日志(Logs) 、跟踪(Traces) 、指标(Metrics) ,这三大元素就是可观测性的三大支柱。

USE 方法

USE是utilization、saturation、erros(利用率、饱和度、错误)三个词的缩写,应用于性能研究,用来识别系统瓶颈,一言以蔽之,就是:对于所有的资源,查看它的使用率、饱和度和错误。

  • 识别系统中有哪些资源(CPU/内存/磁盘/IO带宽等)
  • 分别查看这些资源的三个指标(使用率、饱和度和错误)跟进现象,分析并缩小性能瓶颈的范围(数据中心,服务集群,单机节点,进程,线程,函数,指令)
  • 定位瓶颈,使用适当的优化策略进行优化
  • 观测系统,验证优化收益
  • Utilization:整个系统的平均 CPU 利用率
  • Saturation:一个近似值是第 99 个之间的差异延迟百分位和平均延迟(假设第 99 个是饱和驱动的)
  • Errors:每秒失败的请求数

RED 方法

RED 方法定义了应为体系结构中的每个微服务度量的三个关键指标。这些指标是:
*(请求)Rate - 您服务每秒提供的请求数
*(请求)Errors - 每秒失败的请求数
*(请求)Duration - 每个请求所花时间的分布

一般来说,RED方法只适用于请求驱动的服务,它不适用于面向批处理或流式服务。 它也不是包罗万象的。 而 USE 方法应用于主机 CPU 和内存或缓存等资源时就是一个很好的例子。

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

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

相关文章

网络学习第四篇

引言&#xff1a; 我们在第三篇的时候出现了错误&#xff0c;我们要就行排错&#xff0c;那么我们要知道一下怎么配置静态路由实现ping通&#xff0c;这样子我们才知道下一跳到底是什么&#xff0c;为什么这样子做。 实验目的 理解和掌握静态路由的基本概念和配置方法。 实…

[控制理论]—位置式PID与增量式PID

位置式PID与增量式PID 1.位置式PID 按模拟PID控制算法&#xff0c;以一系列的采样时刻点kT代表连续时间t&#xff0c;以矩形法数值积分近似代替积分&#xff0c;以一阶后向差分近似代替微分&#xff0c;即&#xff1a; t ≈ k T &#xff08; k 0 , 1 , 2... &#xff09; …

【c++丨STL】list的使用

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C、STL 目录 前言 list简介 一、list的默认成员函数 构造函数(constructor) 析构函数 赋值重载 二、list的迭代器接口 迭代器的功能分类 三、list的容量…

Unity 编辑器下 Android 平台 Addressable 加载模型粉红色,类似材质丢失

Unity 编辑器下 Android 平台 Addressable 加载模型粉红色&#xff0c;类似材质丢失 Addressable Play Mode Script加载模式 选择 Use Existiing Build 1.Unity 切换到 PC 平台&#xff0c;执行 Addressable Build 运行&#xff0c;加载 bundle 内的预制体 显示正常 2.Unit…

单片机学习笔记 6. 数码管动态显示

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示 目录 0、实现的功能 1、Keil工程 1-1 数码管动态显示 1-2 数组的定义与引用…

车企如何实现安全图纸外发管理

车企面临着日益增长的数据交换需求&#xff0c;尤其是设计图纸等敏感数据的外发管理。如何确保这些数据在传输过程中的安全性和效率&#xff0c;是车企急需解决的问题。我们将从几个关键性的因素上来分析一下怎么实现安全图纸外发管理。 统一管理与授权 采用专业的文件交换系统…

第7章 硬件测试-7.1 硬件调试

第7章 硬件测试 7.1 硬件调试7.1.1 电路检查7.1.2 电源调试7.1.3 时钟调试7.1.4 主芯片及外围小系统调试7.1.5 存储器件和串口外设调试7.1.6 其他功能模块调试 测试是每项成功产品的必经环节。硬件测试是评估产品质量的重要方法&#xff0c;产品质量是公司的信誉和品牌象征&…

Qt5/QPainter/画家

目录 1.绘制文字 1.1案例 1.2代码 2.画线 2.1案例 2.2代码 3.绘制矩形 3.1代码 4.绘制椭圆和圆 4.1椭圆 4.2圆 5.圆弧 5.1案例: 5.2代码 6.扇形 6.1案例 6.2代码: 7.更改绘画的颜色和粗细 7.1案例 ​编辑 7.2代码 1.绘制文字 1.1案例 通过三种不同的绘…

一篇保姆式centos/unbantu安装docker

前言&#xff1a; 本章节分别演示centos虚拟机&#xff0c;unbantu虚拟机进行安装docker。 上一篇介绍&#xff1a;docker一键部署springboot项目 一&#xff1a;centos 1.卸载旧版本 yum remove docker docker-client docker-client-latest docker-common docker-latest do…

fetch API和XHR

文章目录 一、基本写法1. XMLHttpRequest&#xff08;XHR&#xff09;2. Fetch API 二、兼容性1. XMLHttpRequest&#xff08;XHR&#xff09;2. Fetch API 三、Promise支持1. XMLHttpRequest&#xff08;XHR&#xff09;2. Fetch API 四、请求响应1. XMLHttpRequest&#xff0…

Photoshop(PS)——人像磨皮

1.新建一个文件&#xff0c;背景为白色&#xff0c;将图片素材放入文件中 2.利用CtrlJ 复制两个图层出来&#xff0c;选择第一个拷贝图层&#xff0c;选择滤镜---杂色---蒙尘与划痕 3.调整一下数值&#xff0c;大概能够模糊痘印痘坑&#xff0c;点击确定。 4.然后选择拷贝2图层…

Elasticsearch retrievers 通常与 Elasticsearch 8.16.0 一起正式发布!

作者&#xff1a;来自 Elastic Panagiotis Bailis Elasticsearch 检索器经过了重大改进&#xff0c;现在可供所有人使用。了解其架构和用例。 在这篇博文中&#xff0c;我们将再次深入探讨检索器&#xff08;retrievers&#xff09;。我们已经在之前的博文中讨论过它们&#xf…

《设计模式》创建型模式总结

目录 创建型模式概述 Factory Method: 唯一的类创建型模式 Abstract Factory Builder模式 Prototype模式 Singleton模式 最近在参与一个量化交易系统的项目&#xff0c;里面涉及到用java来重构部分vnpy的开源框架&#xff0c;因为是框架的搭建&#xff0c;所以会涉及到像…

c++类对象练习

#include <iostream> #include <cstring>using namespace std;class mystring {char* buf; public:mystring(); //构造函数mystring(const char* str); //构造函数void show(); //输出函数void setmystr(const mystring str); //设置函数const char* getmystr() co…

CH03_反射

第3章&#xff1a;反射 本章目标 掌握反射的原理 熟悉反射的基本运用 本章内容 反射是什么 C# 编译运行过程 首先我们在VS点击编译的时候&#xff0c;就会将C#源代码编译成程序集 程序集以可执行文件 (.exe) 或动态链接库文件 (.dll) 的形式实现 程序集中包含有Microsoft …

多品牌摄像机视频平台EasyCVR视频融合平台+应急布控球:打造城市安全监控新体系

在当今快速发展的智慧城市和数字化转型浪潮中&#xff0c;视频监控技术已成为提升公共安全、优化城市管理、增强应急响应能力的重要工具。EasyCVR视频监控平台以其强大的多协议接入能力和多样化的视频流格式分发功能&#xff0c;为用户提供了一个全面、灵活、高效的视频监控解决…

数据结构 (3)线性表的概念及其抽象数据类型定义

一、线性表的概念 定义&#xff1a;线性表是指具有相同数据类型的n个数据元素的有限序列。可以表示为L(a1,a2,…,ai,…,an)&#xff0c;其中a1是第一个元素&#xff0c;称为表头&#xff1b;an是最后一个元素&#xff0c;称为表尾。 特点&#xff1a; 有序性&#xff1a;线性表…

Java基础——继承和多态

目录 一、继承 继承的定义&#xff1a; 继承的基本用法&#xff1a; 如何调用父类的方法&#xff1f; 二、多态 多态性的好处 多态中的强制类型转换&#xff1a; 包的命名规则——域名倒叙 一、继承 继承的定义&#xff1a; 继承是面向对象编程中的一种机制&#xff0c…

播放器开发之ffmpeg 硬件解码方案

硬件编解码的概念 硬件编解码是⾮CPU通过烧写运⾏视频加速功能对⾼清视频流进⾏编解码&#xff0c;其中⾮CPU可包括GPU、FPGA或者 ASIC等独⽴硬件模块&#xff0c;把CPU⾼使⽤率的视频解码⼯作从CPU⾥分离出来&#xff0c;降低CPU的使⽤负荷&#xff0c;使得平台能 ⾼效且流畅…

计算机毕业设计SparkStreaming+Kafka旅游推荐系统 旅游景点客流量预测 旅游可视化 旅游大数据 Hive数据仓库 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…