思考:如何保证服务稳定性?

2023-11-15

最近一直在忙618大促的全链路压测&稳定性保障相关工作,结果618还未开始,生产环境就出了几次生产故障,且大多都是和系统稳定性、性能相关的bad case。生产全链路压测终于告一段落,抽出时间将个人收集的稳定性相关资料整理review了一遍,顺带从不同的维度,谈谈稳定性相关的“务虚”认知和思考。。。

一、SLA!

在开始谈稳定性保障之前,我们先来聊聊业内经常提及的一个Topic:SLA!

业内喜欢用SLA (服务等级协议,全称:service level agreement)来衡量系统的稳定性,对互联网公司来说就是网站服务可用性的一个保证。9越多代表全年服务可用时间越长服务越可靠,停机时间越短。就以一个标准99.99%为例,停机时间52.6分钟,平均到每周也就是只能有差不多1分钟的停机时间,也就是说网络抖动这个时间可能就没了。保证一个系统四个9或者更高的五个9,需要一套全体共识严格标准的规章制度,没有规矩不成方圆。创建的规范有如下几种:

1、研发规范、自身稳定;

2、事务中不能包含远程调用;

3、超时时间和重试次数要合理;

4、表数据操作必须double check,合理利用索引,避免出现慢查询、分库分表不走分表键;

5、没有有效的资源隔离, 避免不同业务共用一个线程池或连接池;

6、合理的系统拓扑,禁止不合理服务依赖,能依赖就依赖,否则同步尽量改成异步弱依赖;

7、精简的代码逻辑;

8、核心路径流程必须进行资源隔离,确保任何突发情况主流程不能受影响。

二、单服务稳定性

关键字:开关可控、单一职责、服务隔离、异常兜底、监控发现!

对于稳定性来说,抛开整体系统架构设计,单就每个业务域服务的稳定性也是非常的重要。只有每个业务环节都稳如泰山,才能保障整个稳定性。单服务稳定可以从以下几个方面来进行:

1、禁用设计:应该提供控制具体功能是否开启可用的配置,在相应的功能服务出现故障时,快速下线局部功能,以保证整体服务的可用性;

2、必要的缓存:缓存是解决并发的利器,可以有效的提高系统的吞吐量。按照业务以及技术的纬度必要时可以增加多级缓存来保证其命中率;

3、接口无状态性:服务接口应是无状态的,当前接口访问不应该依赖上层接口的状态逻辑;

4、接口单一职责性:对于核心功能的接口,不应该过多的耦合不属于它的功能。如果一个接口做的事情太多应做拆分,保证单接口的稳定性和快速响应;

5、第三方服务隔离性:任何依赖于第三方的服务(不论接口还是中间件等),都应该做到熔断和降级,不能有强耦合的依赖;

6、业务场景兜底方案:核心业务场景要做到完整兜底方法,从前端到后端都应有兜底措施;

7、服务监控与及时响应:每个服务应做好对应监控工作,如有异常应及时响应,不应累积。

三、集群稳定性

关键字:系统架构、部署发布、限流熔断、监控体系、压测机制!

对于集群维度的稳定性来说,稳定性保障会更加复杂。单服务是局部,集群是全局。一个见微知著,一个高瞻远瞩。

1、合理的系统架构:合理的系统架构是稳定的基石;

2、小心的代码逻辑:代码时刻都要小心,多担心一点这里会不会有性能问题,那里会不会出现并发,代码就不会有多少问题;

3、优秀的集群部署:一台机器永远会有性能瓶颈,优秀的集群部署,可以将一台机器的稳定放大无限倍,是高并发与大流量的保障;

4、科学的限流熔断:高并发来临时,科学的限流和熔断是系统稳定的必要条件;

5、精细的监控体系:没有监控体系,你永远不会知道你的系统到底有多少隐藏的问题和坑,也很难知道瓶颈在哪里;

6、强悍的压测机制:压测是高并发稳定性的试金石,能提前预知高并发来临时,系统应该出现的模样;

7、胆小的开发人员:永远需要一群胆小的程序员,他们讨厌bug,害怕error,不放过每一个波动,不信任所有的依赖。

四、稳定性专项

专项指的是针对某些特定场景下的特定问题而梳理出对应的方案。下面是针对一些常见的稳定性专项的概述:

1、预案:分为定时预案和紧急预案,定时预案是大促常规操作对于一系列开关的编排,紧急预案是应对突发情况的特殊处理,都依赖于事前梳理;

2、预热:分为JIT代码预热和数据预热,阿里内部有专门的一个产品负责这块,通过存储线上的常态化流量或者热点流量进行回放来提前预热, 起源于某年双十一零点的毛刺问题,原因是访问了数据库的冷数据rt增高导致的一系列上层限流,现在预热已经成了大促之前的一个必要流程。

3、强弱依赖:梳理强弱依赖是一个偏人肉的过程,但是非常重要,这是一个系统自查识别潜在风险点并为后续整理开关限流预案和根因分析的一个重要参考,阿里内部有一个强弱依赖检测的平台,通过对测试用例注入RPC调用的延迟或异常来观察链路的依赖变化,自动梳理出强弱依赖关系。

4、限流降级熔断:应对突发流量防止请求超出自身处理能力系统被击垮的必要手段;

5、监控告警&链路追踪:监控分为业务监控、系统监控和中间件监控和基础监控,作为线上问题发现和排查工具,重要性不言而喻。

五、稳定性建设

稳定性建设,就和基础技术建设一样,是一个长期迭代和不断调整的过程,业内常见的稳定性建设类型,主要有如下几种:

1、容量规划:个人感觉容量规划在大厂里也并没有做的很好,更多依赖的是业务方自己拍脑袋,然后全链路压测期间验证,不够就再加机器。

2、混沌工程:混沌工程是近几年比较火的名词,通过不断给系统找麻烦来验证并完善系统能力,阿里在这块花了很大的精力建设红蓝军对抗攻防,进行定期和不定期的演练,最后以打分的形式来给各个部门系统做排名,除了系统层面的故障演练外还有资金演练,篡改线上sql语句制造资损来测试业务监控纠错的能力,通过制造小错来避免大错。

跳转门:混沌工程-初识

3、流量调度:通过metric秒级监控和聚类算法实时找出异常单机来降低RPC流量权重,提升集群整体吞吐能力减少异常请求。

4、容灾&异地多活:起源于15年某施工队将光纤挖断带来的支付宝故障,由此出来的三地五中心和单元化架构,异地多活本身的成本比较高,然后又存在数据同步的延时问题和切流带来的脏数据问题,对于业务和技术都有比较高的要求。常见的容灾有如下几种:

  1)缓存挂掉,集群重启缓存预热如何处理?本地缓存,多级缓存是否可以替代?

  2)分布式锁,是否有开关一键切换?比如:ZK/ETCD编写的分布式锁;

  3)大促峰值流量,如何防止外部ddos攻击?如何识别流量类型?

  4)资源隔离:资源隔离,服务分组,流量隔离;

  5)高可用思想:避免单点设计!

  6)容错:容错上游,防御下游。容错主要需要注意如下几点:

    6-1:外部依赖的地方都要做熔断,避免雪崩;

   6-2:对于依赖我们的上游要限流,防止上游突发超过自己系统能够扛住的最大QPS;

   6-3:对于下游既要评估好接口超时时间,防止下游接口超时导致自己系统被拖累;

   6-4:下游接口要考虑各种异常情况,需要考虑中间状态,通过引入柔性事务,确保数

据最终一致。

5、异地多活

异地多活的本质,是数据中心架构的演进

1)演进:单机房——双机房——异地灾备——异地多活;

2)定义:分多个地域、多个数据中心运行线上的业务,并且每个IDC均提供在线服务;

3)优点:弹性扩展能力、流量就近接入、灵活调度、提升可用性与用户体验、容灾;

4)步骤

  4-1:基础设施:机房之间专线互联,保证网络质量稳定;

  4-2:持久存储:一主三从,主IDC同步复制,异地IDC异步复制;

  4-3:中间件:DB、MQ、分布式存储;

  4-4:应用部署:根据应用域划分,不同应用部署在不同地域,保持亲缘性;

  4-5:流量接入与调度:网络协议兼容,DNS,动态调度用户就近访问;

  4-6:监控与运维保障:专线实时监控,确保发生故障时可以触发Failover(失效备援)和

流量调度。

六、稳定性思考

关键字:阶段工作、角色转变!

稳定性建设是一个演进的阶段性过程,主要分为三个阶段:

1、发现问题解决问题:当问题较多时候就很被动,很多时候我们通过不断完善监控来确保我们来快速定位问题,但仍处于被动的一方;

2、主动寻找问题:混沌工程、破坏性测试、极限压测、红蓝对抗等手段,一方作为创造问题方不断挑战系统极限,另一方见招拆招快速修复。

3、角色转变:这个过程中会积累很多处理问题的经验,不断完善系统健壮性,争取在用户发现问题前消灭于萌芽中。角色转变,变被动为主动。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

思考:如何保证服务稳定性? 的相关文章

  • Allegro使用总结-查看Layout基本操作:

    好久没用CSDN写过笔记了 没想到无意间打开 编辑器更新啦 以前巨难用的 富文本编辑器 终于改观了 变的好像语雀 1 视图 画面操作 a 画面缩放 Zoom F11 F12 或 鼠标滚轮 补充 Zoom分辨率调节 Setup user pr
  • 微信支付的收款功能被限制了怎么办,收款受限制怎么解除?

    使用小程序做电商 商城的微信支付的收款功能会遇到被限制的情况 直接影响用户下单后的付款操作 其实也不单单是小程序 商城APP中也会冒出类似的提示 遇到这种事情不要慌 根据具体的异常提示给出不同的解决方案 微信支付被限制的错误提示 我们列举两
  • 【100%通过率 】【华为OD机试c++/java/python】最长的密码【 2023 Q1A卷

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 最长的密码 小王在进行游戏大闯关 有一个关卡需要输入一个密码才能通过 密码获得的条件如下 在一个密码本中 每一页都有一个由26个小写字母组成的若
  • Python安全攻防之第二章Python语言基础

    2 3 Python模块的安装与使用 python模块的安装 pip3 install 模块名称 py 3 m pip install 模块名称 python模块的导入与使用 1 Import模块名称 采用 Import模块名称 方式时 需
  • 业务流程图怎么画?3步+8张案例,5分钟教你快速上手!

    业务流程图能很好地帮助我们梳理业务 高效表达需求 尤其是产品经理在梳理业务时 经常会用到业务流程图 业务流程图会在产品经理画原型图前 帮助梳理产品业务流程 避免做无用功 今天从业务历程图的基本介绍 常用场景和绘制方法三方面介绍 让大家对业务
  • 什么是Java?

    刚开始学习Java时 对于老师讲述的Java的发展历程毫无兴趣 觉得只要会用就行了 直到有一天我的朋友突然问我 你们学的Java是什么呀 面对他突如其来的问题 我一下有点不知所措 刚想开口却又不知道说些什么 只能慢慢的吐出那几个字 一门编程
  • win11共享打印机无法连接怎么办

    很多小伙伴都将电脑更新升级成Win11系统 当我们使用多台电脑却只有一台打印机时 就需要共享打印机却出现了Win11共享打印机无法连接的情况 遇到这种问题应该怎么解决呢 下面小编就给大家详细介绍一下Win11共享打印机无法连接的解决方法 大
  • VisualStudio—Remote Debug

    主要用来解决本地调试没问题发布到远端后却报错的项目 一 Windows Debug Windows 本文叙述采用的VS2022 远端 windows服务器 安装远程调试器 远端 windows服务器 安装过程省略 详见官方参考链接中设置远程
  • java动态加载jar包,并运行其中的类和方法

    flink 相关 https www toutiao com article 6883793897495986691 动态加载jar包 在实际开发中经常会需要用到 尤其涉及平台和业务的关系的时候 业务逻辑部分可以独立出去交给业务方管理 业务
  • Vue—实现动画、过度效果

    动画效果
  • Allegro PCB封装焊盘介绍(一)

    PCB封装焊盘结构 焊盘结构如图 1所示 图 1焊盘结构 锡膏层 SMT刷锡膏贴片用 一般贴片焊盘要选 跟焊盘等大 阻焊层 把焊盘裸露出来 不开的话 焊盘会被油墨盖住 这样无法焊接哦 一般比焊盘大0 1mm 顶层 底层焊盘 实际焊盘大小 电
  • 【计算机基础

    定点数的表示 定点数 小数点的位置固定 例 996 007 常规计数 浮点数 小数点的位置不固定 例 9 96007 10 2 科学计数法 二进制的定点数 浮点数也类似 无符号数 整个机器字长的全部二进制位均为数值位 没有符号位 相当于数的
  • Tomcat 系统架构与设计模式之工作原理篇

    本文以 Tomcat 5 为基础 也兼顾最新的 Tomcat 6 和 Tomcat 4 Tomcat 的基本设计思路和架构是具有一定连续性的 Tomcat 总体结构 Tomcat 的结构很复杂 但是 Tomcat 也非常的模块化 找到了 T
  • 通过微信小程序实现登录功能

    后端服务器可以在CSDN上开通 价格优惠 CSDN开发云 https img home csdnimg cn images 20220518054835 png https dev csdn net activity utm source
  • Nim 游戏

    你和你的朋友 两个人一起玩 Nim 游戏 桌子上有一堆石头 你们轮流进行自己的回合 你作为先手 每一回合 轮到的人拿掉 1 3 块石头 拿掉最后一块石头的人就是获胜者 假设你们每一步都是最优解 请编写一个函数 来判断你是否可以在给定石头数量
  • JSON介绍及代码示例

    了解json JSON是什么 JSON是JavaScript Object Notation的缩写 它是一种数据交换格式 在JSON出现之前 大家一直用XML来传递数据 因为XML是一种纯文本格式 所以它适合在网络上交换数据 XML本身不算
  • Redis热点数据处理

    1 概念 热点数据就是访问量特别大的数据 2 热点数据引起的问题 流量集中 达到物理网卡上限 请求过多 缓存分片服务被打垮 redis作为一个单线程的结构 所有的请求到来后都会去排队 当请求量远大于自身处理能力时 后面的请求会陷入等待 超时
  • 深度学习目标跟踪算法

    ECCV 2022 OSTrack Joint Feature Learning and Relation Modeling for Tracking https blog csdn net qq 41442511 article deta
  • springboot整合shiro的坑记录

    首先我参考文章 https blog csdn net Yearingforthefuture article details 117384035 进行学习 由于此文章没有讲springboot的版本 我于是用了idea2022 3 1的默
  • 如何设计一个高并发系统?

    所谓高并发系统 是指能同时处理大量并发请求 并及时响应 从而保证系统的高性能和高可用 那么我们在设计一个高并发系统时 应该考虑哪些方面呢 1 搭建集群 如果你只部署一个应用 只部署一台服务器 那抗住的流量请求是非常有限的 并且 单体的应用

随机推荐

  • C/C++学习——自定义数据类型——链表

    链表的概念 一 链表的概念 1 链表是一种存储空间能动态进行增长或缩小的数据结构 2 链表主要用于 1 建立不定长度的数组 2 可以在不重新安排整个存储结构的情况下 方便且迅速地插入和删除数据元素 3 链表广泛应用于数据管理中 二 结点 s
  • 延时任务的四种实现方式

    什么是延迟任务 顾明思议 我们把需要延迟执行的任务叫做延迟任务 延迟任务的使用场景有以下这些 红包 24 小时未被查收 需要延迟执退还业务 每个月账单日 需要给用户发送当月的对账单 订单下单之后 30 分钟后 用户如果没有付钱 系统需要自动
  • D0006-进制,位运算,原反补码

    十进制转其他进制 公式 除基取余 直到商为0 把余数反转拼接 十进制10转换二进制 商 余数 10 2 5 0 5 2 2 1 2 2 1 0 1 2 0 1 把余数反转拼接 1010 原码反码和补码 原码 一个二进制数据 最高位符号位 0
  • 数据存储---整形数据在内存中的存储

    我们每一次写代码的时候 都会创建变量 那么所创建的整形变量是如何在内存中存储的呢 目录 1 数据类型介绍 2 整形数据在内存中的存储形式 3 大小端字节序的介绍 1 数据类型介绍 本文重点介绍内置类型中的整形家族 1 内置类型 C语言本身具
  • JDK安装配置(Windows10)

    环境 windows10 官方链接 https www oracle com technetwork java javase downloads jdk8 downloads 2133151 html 点击Accept License Ag
  • 由于找不到msvcp120.dll无法继续执行代码怎么办?

    msvcp120 dll是微软软件包的一部分 它是一个库文件 可用于支持软件运行时 msvcp120 dll的作用是提供计算机程序所需的标准库 msvcp120 dll还负责管理堆内存 线程和异常处理函数等 在使用windows编写的应用程
  • indows npm ERR! gyp ERR! find Python Python is not set from command line or npm configuration npm ER

    问题描述 windows npm ERR gyp ERR find Python Python is not set from command line or npm configuration npm ERR gyp ERR find P
  • SSL工作原理

    转自 https www wosign com Basic howsslwork htm SSL 是一个安全协议 它提供使用 TCP IP 的通信应用程序间的隐私与完整性 因特网的 超文本传输协议 HTTP 使用 SSL 来实现安全的通信
  • 一个函数名后面加const表示什么意思

    const用在成员函数后 主要是针对类的const 对象 如 class Text public void printconst void const cout lt lt hello lt
  • java匿名对象的使用

    package object oriented04 import object oriented03 Person public class InstanceTest public static void main String args
  • 力扣OJ(1601-2000)

    目录 1602 找到二叉树中最近的右侧节点 1611 使整数变为 0 的最少操作次数 1612 检查两棵二叉表达式树是否等价 1631 最小体力消耗路径 1632 矩阵转换后的秩 1634 求两个多项式链表的和 1644 二叉树的最近公共祖
  • 【KnowledgeBase】目标追踪模型MOTR论文简要理解

    系列文章目录 文章目录 系列文章目录 前言 一 主要思想 二 整体架构 二 细节 1 Detect Query和Track Query 2 Tracklet Aware Label Assignment TALA 3 QIM模块 总结 前言
  • linux搭建主备负载均衡

    1 原理图 底层原理 2 负载集合的功能 1 客户端传过来的请求 在负载均衡那里 根据算法 把用户的请求给指定的服务器 2 如果负载均衡主机宕机了 备机马上接手 如果主机恢复了 备机马上退后 3 如果某个服务器挂了 该服务器马上被踢出去 负
  • mac 打开网页慢_苹果笔记本打开网页很慢是什么原因

    有时候我们找资料会发现网页打开很慢 这是怎么回事呢 为什么网页打开会很慢呢 以下就是小编给你做的整理 希望对你有用 的原因 一 网络最小带宽这是最主要的因素 也就是网友经常说的宽带不够 同样的网站 如果宽带高 访问速度就会明显变快 网络的带
  • ubantu18.04安装Opencv4.0.0

    1 安装依赖 sudo apt get install build essential sudo apt get install cmake git libgtk2 0 dev pkg config libavcodec dev libav
  • 使用z-file和七牛云对象存储构建个人网盘

    最近想构建一个个人网盘玩玩 用来存储些资源 这里使用云服务器 zfile 七牛云对象存储进行搭建 租用云服务器 首先需要在常用的云服务网站买一个云服务器 如阿里云 腾讯云等 这里不说该怎么租用和搭建了 使用七牛云对象存储 这里使用七牛云对象
  • 02功能之读写文件流操作(C语言实现读取文件指定一行)

    02功能之读写文件流操作 C语言实现读取文件指定一行 1 C语言读取文件指定一行 读取文件指定一行 int ReadLine1 const char fileName char outBuf int n int whichLine n 指定
  • sql查询一个字段包含另一个字段内容

    SELECT FROM tbl name WHERE a like CONCAT b 字段a包含字段b 例如 Find the capital and the name where the capital includes the name
  • java libusb_libusb中断传输

    我需要对定制的HID USB设备 控制面板上的一些按钮和LED 进行反向工程 该驱动程序仅在Windows上可用 我们需要 nix实现 该设备显然是HID设备 但不是特定类 它提供两个接口 每个接口都有一个中断 endpoints 我的设置
  • 思考:如何保证服务稳定性?

    最近一直在忙618大促的全链路压测 稳定性保障相关工作 结果618还未开始 生产环境就出了几次生产故障 且大多都是和系统稳定性 性能相关的bad case 生产全链路压测终于告一段落 抽出时间将个人收集的稳定性相关资料整理review了一遍