聊一聊大型网站稳定性建设思路
目录
架构阶段的稳定性建设项目
编码阶段的稳定性建设
测试阶段的稳定性建设
发布阶段的稳定性建设
运行阶段的稳定性建设项目
故障发生时的稳定性建设
网站稳定性的建设是一项综合的系统工程,就像人的健康一样,如果平时不注意健康饮食、不注意锻炼,时间 长身体肯定会出问题,对稳定性的考量也是贯穿整个研发生命周期的如下图:
在网站的架构设计时就要考虑稳定性 考虑到网络光纤有可能被挖断,如果只有一个 房那就悲剧了, 100% 流量都没了 甚至要考虑自然灾害的影响而多地建设机房稳定性的建设中有两个重要因素:一是思想上重视,开发人员对稳定性的重视(也就是敬畏之心)可以避免 70% 的故障;二是规范和工具的建设,用以保障稳定性。
架构阶段的稳定性建设项目
一个网站要有好的稳定性,必须在架构设计阶段就做长远考虑,就像建房子要先打好基础一样,否则楼建得越高越危险。
建设高稳定性的架构必须注意以下几点
避免单点: 高可用架构设计的第一条就是要避免单点,从概率出发来 ,无论是机器还是人,没有什么东西是不会犯错的, 避免某个完整的环节成为单点是架构设计的原则但是,在某些场景中,有些功能必须放在同一个应用中,例如统一登录、 网关 、安全过滤等 ,此时要保证尽 按照人群来划分,不要在逻辑上出现单点;或者尽 把服务拆成组件迁到不同的端上执行,例如,可以把安全服务作为 个模块集成 Nginx 或者应用机器中,而不是把它做成一个远程服务接口。
分组隔离: 把应用拆得更细一点,不同的功能模块做成单独的分组,每个分组占用一部分机器集群,这样可以做到服务分组隔离,避免不太重要的分组对重要分组的 现在非常流行的微服务就是一种非常好的分组隔离的实践。
异步化: 在系统设计中要让尽可能多的远程调用异步化,这 是一项重要原则很多时候会因为一个不太重要的功能的强依赖拖垮了整个应用,所以要尽量把不太重要的依赖改成异步调用,避免影响主调用链路的稳定性。
异地容灾 :考虑到很多不可抗力因素 影响,我 需要设计网站的 地容灾甚至全球部署策略,这些不可抗力的事件往往会影响网站的整个架构,必须做长远打算。
编码阶段的稳定性建设
编程阶段的稳定性建设尤其重要, 个好的程序在编码阶段就决定了整个应用系统的质 ,所以在编码阶段要注意下面一些规则:
错误捕获 :一个优雅的系统必然有一套优雅的异常处理机制,在适当的地方如I/O 处理、远程调用、多线程等关键处捕获异常非常重要,防御性编程可以更好地保证系统的健壮性;
异步线程: 在一些批处理调用的地方采用异步线程可以保证主请求的正常返回,同样也可以做到部分的隔离,防止部分请求挂起整个应用;
超时处理 :在远程调用或者调用外围设备时,非常有必要设定超时时间,这样可以保证所有的请求都有一个可预知的返回结果;
限流保护: 每个应用都有一个承载极限,超过这个极限就会带来很大的不确定性,因此,设置自我保护机制可以保证程序的健壮性;
测试阶段的稳定性建设
测试是程序上线前的最后一道保障,测试也是验证程序是否达到预期功能的手段,在本阶段要注意以下事项
自动化对比测试 对比测试就是用线上真实的环境和数据与预发环境对相同的业务接口做返回值的比较,以此判断新上线的代码是否符合预期。
Beta 测试 在线上的真实环境中选取若干台机器,通过绑定 VIP 的方式访问此机器上的数据,以此验证程序是否正确。
发布阶段的稳定性建设
发布阶段稳定性建设应留意以下事项:
分批发布 分批发布可以降低发布风险,不仅可以减少系统部署重启引起的RT 抖动,也可以在发现问题时 即终止发布
多版本发布 合并部署是将多个应用系统同时部署在同 Web 容器实例中共享同 个进程,每个应用之间相互隔离,但是应用之间的 RPC 是通过本地调用而不通过网络调用。
运行阶段的稳定性建设项目
运行阶段稳定性建设要做好几件事:实时监控报警、过载保护和自动降级、实时数据对账,核心原则是实时发现问题,提供必要的保护措施。
实时监控报警 线上监控必须包含系统监控,主要是监控服务器的 CPU Loa磁盘、内存等一些系统指标的异常情况;应用监控主要是监控响应时间、 QPS异常错误等;业务监控主要是监控一些业务指标是否有异常(如实时的下单量、司机和乘客的在线数量业务指标)。
过载保护和自动降级 线上运行中的系统需要有一些保护措施,如系统的某些指标达到瓶颈时要有必要的保护 Loa 达到系统的最高瓶颈时需要拒绝一些请求,以防止系统被压垮;涉及 些远程调用时可以设置最大并发数,一旦超过该阀值就自动 fast fail 以保护系统。
实时数据对账 这属于业务监控范围 在涉及 些敏感信息时,为了确保正确性,需要有实时的对账校验,最典型的就是资金数据,以及涉及跨单元数据复制时对数据一致性的对账检查.
故障发生时的稳定性建设
一旦发生故障,最重要的就是快速止损、定位故障并快速恢复 按照经验,当故障发生时,第一反应就是快速回滚了解故障现象,根据故障现象判读故障原因,进而找出解决办法。
减少故障的定位时间和快速恢复策略在故障发生时是至关重要的。
故障定位 快速定位故障可以缩短故障的恢复时间 如何定位故障?据统计,90% 的故障都是由变更所致,所以快速收集变更信息和线上机器的异常数据非常重要,但难点在于这些数据往往散落在各个 方,井且格式多样。
快速恢复 影响故障恢复时间的一是故障定位时间,二是所采用的快速恢复的手段 例如在多版本部署出现故障时,可以通过快速切换版本来恢复;在异地多活的情况下可以把流量切换到不同的单元来止损。
相关文章:

聊一聊大型网站稳定性建设思路
目录 架构阶段的稳定性建设项目 编码阶段的稳定性建设 测试阶段的稳定性建设 发布阶段的稳定性建设 运行阶段的稳定性建设项目 故障发生时的稳定性建设 网站稳定性的建设是一项综合的系统工程,就像人的健康一样,如果平时不注意健康饮食、不注意锻炼…...

Nginx常用配置
Windows版本Nginx开机自启动 可直接下载已经配置好的文件,点击即可下载:Windows版本Nginx1.26.0 下载WinSW v2.12.0 首先从https://github.com/winsw/winsw/releases下载WinSW v2.12.0 下载Nginx 下载地址https://nginx.org/en/download.html 修…...

前端开发中遇到的小问题以及解决方案记录2
1、H5中适配屏幕的工具-postcss-px-to-viewport postcss-px-to-viewport。因为设计稿一般给的都是375px宽度的,所以假如一个字体是16px,那么在开发中不能直接写死为16px,因为各个厂商的手机屏幕大小是不同的,所以要根据屏幕大小去…...

Qt-常用控件(3)-输入类
1. QLineEdit QLineEdit 用来表示单行输入框.可以输入一段文本,但是不能换行 核心属性 属性说明text输入框中的文本inputMask输入内容格式约束maxLength最大长度frame是否添加边框echoMode显示方式. QLineEdit::Normal :这是默认值,文本框会显示输入的文本。QLineE…...
使用Docker启动Redis容器并映射端口
在现代软件开发中,Redis 是一种非常流行的开源内存数据结构存储,通常用作数据库、缓存或消息传递系统。Docker 是一个开源的应用容器引擎,它允许开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux …...

用fastapi搭建cpca地址提取服务接口
以前的客户地址比较乱,现在想提取出省份城市, 开始了解分词技术,后发现python有这样的库 cpca提取地址挺不错,可以从垃圾地址中提取省市区以及区号。 文章会用fastapi搭建服务端 通过post调用cpca,提取来了后&#…...
libvncclient编写多线程qt的VNC客户端
概述 使用qt和libvncclient编写vnc的客户端程序,多线程读写,拒绝卡顿。qt环境:5.15.3libvncclient:0.9.14下载地址:https://github.com/LibVNC/libvncserver/releases 编译libvncclient 打开CMakeList文件ÿ…...
视频处理基础之gradio框架实现
这些函数是用于处理视频文件的Python代码片段,它们依赖于ffmpeg和ffprobe工具,这些工具是FFmpeg项目的一部分,用于处理视频和音频数据。下面是每个函数的用途和用法的总结: 1. ffmpeg_installed() 函数: - 用途&am…...

黑马点评2——商户查询缓存(P37店铺类型查询业务添加缓存练习题答案)redis缓存、更新、穿透、雪崩、击穿、工具封装
文章目录 什么是缓存?添加Redis缓存店铺类型查询业务添加缓存练习题 缓存更新策略给查询商铺的缓存添加超时剔除和主动更新的策略 缓存穿透缓存空对象布隆过滤 缓存雪崩解决方案 缓存击穿解决方案基于互斥锁方式解决缓存击穿问题基于逻辑过期的方式解决缓存击穿问题…...

概率DP (由一道绿题引起的若干问题。目前为一些老题,蒟蒻的尝试学习1.0)
概率DP: 利用动态规划去解决 概率 期望 的题目。 概率DP 求概率(采用顺推) 从 初始状态推向结果,同一般的DP类似,只是经历了概率论知识的包装。 老题: 添加链接描述 题意: 袋子里有w只白鼠&am…...
[Python]生成器和yield关键字
生成器和yield关键字 1.生成器介绍: 概述: 它指的是 generator, 类似于以前学过的: 列表推导式, 集合推导式, 字典推导式… 作用: 降低资源消耗, 快速(批量)生成数据. 实现方式: 1.推导式写法. my_generator (i for i in range(5)) 2.yield写法. def get_gene…...

Nginx 负载均衡+高可用 集群部署(Keepalived+LVS DR模式)
一、LVS负载均衡简介 1.1 LVS基本介绍 LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导开发的开源负载均衡项目,目前LVS已经被集成在Linux内核中。该项目在Linux内核中实现了基于IP地址的请求数据负载均衡调度方…...
算法 | 基础 | 出现奇数次的数字
这里写自定义目录标题 异或运算题目1题目2 本篇是关于异或(^)运算的运用。后期看算法过程中如果再碰到异或的都会收录到本篇中 异或运算 在逻辑学中,逻辑算符异或(exclusive or)是对两个运算元的一种逻辑析取类型&am…...

log4j 控制台和文件输出乱码问题解决
一个小问题,却让我感觉到,现在真正动脑的人很少。。我来说说吧。 今天遇到一个小问题, log4j输出到文件乱码,控制台正常。显然是编码问题导致。Google一搜,几乎一水的说: 项目中log4j在英文版linux下输出中…...

在国产芯片上实现YOLOv5/v8图像AI识别-【4.2】RK3588获取USB摄像头图像推流RTSP更多内容见视频
本专栏主要是提供一种国产化图像识别的解决方案,专栏中实现了YOLOv5/v8在国产化芯片上的使用部署,并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 B站配套视频:https://www.bilibili.com/video/BV1or421T74f 前言…...
TCP/IP协议栈详解及其在现代网络中的应用
在当今数字化时代,网络已成为我们生活中不可或缺的一部分。无论是社交、工作还是娱乐,网络都在背后发挥着至关重要的作用。而这一切的实现,都离不开TCP/IP协议栈。本文将详细介绍TCP/IP协议栈的结构、各层功能以及它在现代网络中的应用。 什…...

亚信安全荣获“2024年网络安全优秀创新成果大赛”优胜奖
近日,由中央网信办网络安全协调局指导、中国网络安全产业联盟(CCIA)主办的“2024年网络安全优秀创新成果大赛”评选结果公布。亚信安全信舱ForCloud荣获“创新产品”优胜奖,亚信安全“宁波市政务信息化网络数据安全一体化指挥系统…...

如何从硬盘恢复已删除/丢失的文件?硬盘恢复已删除的文件技巧
如何从硬盘恢复已删除/丢失的文件?本教程将教您如何使用专业硬盘恢复软件从内置或外置硬盘恢复数据,或不使用软件从硬盘恢复已删除的文件。 “有人知道如何从外部硬盘恢复文件吗?当我将外部硬盘插入计算机时,我错误地删除了一些文…...

[Linux]:权限
✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. Linux权限的基本概念 1.1 root与普通用户 在Linux系统中,存在…...
启动Spring Boot报错
一、遇到的问题 启动Spring Boot报错 Unable to close ApplicationContext org.springframework.boot.SpringApplication: Application run failed java.lang.IllegalStateException: Error processing condition on org.springframework.boot.autoconfigure.cache.CacheAutoCo…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...