需求分析引言:架构漫谈(三)可用性专题

news2024/9/27 9:28:51

前文介绍了非功能性需求的各个指标和一些业界的标准。
非功能性需求里有一项可靠性,与之关联的一个指标叫可用性
本文对非功能性需求里的可用性、可靠性,进行一些详细的说明。

概念

我们在网上的云服务商处,经常看到产品介绍里会有这种字样:我们的服务可用性高达 99.99%
这个可用性的含义是什么?

  • 定义:
    指系统在一段时间内,正常运行和可正常使用的时间占比。
    例如:一年内,某系统正常运行364天,故障累计时长1天,则可用性为 364/365 ≈ 99.7%
  • 与可靠性的区别:
    可靠性是考察两次故障的平均间隔时长。
  • 通常情况下,两者是有关联的,即可靠性好,通常可用性也高。
    但是也存在例外情况,如下面2个场景对比:
    • 可用性高但可靠性不好
      每分钟都会宕机一次,1秒就恢复正常了,可用性比较好≈ 98.3%
      但是故障概率高,连续正常服务时间仅为59秒,所以可靠性差
    • 可靠性好但可用性不高
      每天宕机一次,每次2小时,可用性比上面的场景要差≈ 91.7%
      但是比上一个场景,可靠性好,它的连续正常服务时间为22小时

度量

对一个软件系统的可用性,度量方法通常有两种:

基于时间

Uptime / (Uptime+Downtime)
即正常工作的时长,除以总时长

基于请求

Success / Total
即成功响应次数,除以总请求次数

下面2张图,左边是列举一个系统达到该可用性时,每年的平均故障时间,右边是常见云服务对外承诺的可用性:
在这里插入图片描述
从上面的图,可以看出:

  • 越低的可用性,对用户的影响越大,故障多了,用户抱怨、投诉、流失的概率就越大
  • 云服务厂商承诺的可用性,有的也并不高,你的系统在设计时,一定也要考虑云服务厂商的故障影响
    参考:
    • 阿里云SLA服务等级协议声明:https://help.aliyun.com/document_detail/56773.htm
      短信服务的可用性只承诺95%,存储的可用性可以达到99.995%
    • 微软云Azure: https://azure.microsoft.com/zh-cn/support/legal/sla/

题外话:

  • 云厂商出现故障时,只要时长不超出承诺的可用性,基本上只是道歉;即使超出了,一般也只是赔偿对应的故障时长,比如故障1小时,赔偿你3小时的云服务使用时长,仅此而已。
    所以,你数据丢了,如果没闹大,一般就只能自己想办法了。
    可以搜索:2018年发生的 前沿数控在腾讯云数据丢失事件,索赔千万,只赔付13万。

  • 我以前公司的SaaS服务,部署在阿里云上,在服务出故障时,市场人员先跟用户说:阿里云又挂了,然后才是对老板投诉研发人员

  • 绝大多数的Web服务,其可用性都在3个9,甚至以下的水平

如何提升可用性

案例分析

假设某系统,有一个登录请求,需要访问4个DB数据库(mysql/mongodb/cassandra/redis),已知每个DB的可用性是99.9%,如图:
在这里插入图片描述
那么这个请求的可用性是多少?
这个串联系统请求的实际可用性:99.9%的4次方 = 99.6%,这意味着:
单个DB,是99.9%的可用性,即全年会有8.76小时不可用;
但是4个DB进行串行请求后,变为全年35.04小时不可用,故障概率翻了4倍。

而且图中还有其它服务器、网络,假设网络不稳定,导致每个DB的可用性降低到了99.5%,则:
这个串联系统请求的可用性降低为:99.5%的4次方 = 98%
相当于全年有175.2小时不可用,平均每个月宕机14.6小时

提升可用性的方法

从上面的案例,可以得出,一个系统里涉及的模块(微服务)、中间件(数据库、消息队列等)越多,可用性越低。
那么如何提升可用性呢?
唯一的答案是使用 并联,即服务冗余,也就是我们常说的负载均衡;

  • 串联系统(2个节点)的可用性计算: A = p1 * p2
    如2个节点的可用性都是99%,则 A = 99% * 99% = 98.01%
  • 并联系统(2个节点)的可用性计算: A = 1-(1-p1)*(1-p2)
    如2个节点的可用性都是99%,则 A = 1-(1-99%) * (1-99%) = 99.99%
    冗余一个节点,可用性就能从99%提升到99.99%,从年故障87.6小时,降低到52分钟

如何实现系统并联:

  • 对于每个服务,都部署在多台独立的服务器上;
  • 前端有一个网关,接收请求,根据服务的每个节点状态,发送到健康节点上
  • 网关自身也要做冗余,通常会通过一套选举机制来保证网关自身健康状态,选举机制常见的有Paxos算法、Raft算法,可以自行搜索

困难点:

  • 架构设计复杂,且涉及旧系统改造,有的系统不支持并联,比如用了内存缓存、用了Session等;
  • 成本翻倍,需要综合考虑产品的市场与开发成本、部署成本、后续的运维成本;
  • 使用容器,如K8S时,要注意同一个服务的多个实例(Pod),要部署在不同的工作节点上;
    我就碰到过一个服务的2个pod,在同一个node上,结果这个node宕机了,整个服务都不可用了。

确定优化目标

要提升系统的可用性,不是盲目的为每个服务、每个中间件去增加并联处理,而应该遵循一定的步骤:

  • 1、确定合适的可用性目标
    • 调研用户期望
    • 确定公司的商业目标(ToB产品至少99.9%以上)
    • 参考竞品规模及服务水平
  • 2、度量我们的系统
    常见的度量,确定指标,进行埋点和数据收集(如Proetheus),然后进行统计计算,统计结果:
    avg、max、min、dev(平均差(∑|x-x‘|)÷n )、长尾(95分位、99分位)

可用性结语

参考下图,指示了一个产品运营的三个阶段:
在这里插入图片描述
通过这张图,我想说:
再牛X的架构、中间件,都是逐步演化、一步步沉淀出来的,一开始大家都很人肉。。。

持续重构……

下一篇,介绍一下性能相关概念,以及如何发现性能问题的一些方法

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

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

相关文章

Redis【实战篇】---- 分布式锁-redission

Redis【实战篇】---- 分布式锁-redission 1. 分布式锁-redission功能介绍2. 分布式锁-redission快捷入门3. 分布式锁-redission可重入锁原理4. 分布式锁-redission锁重试和WatchDog机制5. 分布式锁-redission锁的MutiLock原理 1. 分布式锁-redission功能介绍 基于setnx实现的分…

【AcWing算法基础课】第一章 基础算法(部分待更)

文章目录 前言课前温习一、快速排序核心模板1.1题目描述1.2思路分析1.3代码实现 二、归并排序核心模板2.1题目描述2.2思路分析2.3代码实现 三、二分查找整数二分题目一3.1题目描述3.2思路分析3.3代码实现 浮点数二分题目二3.1题目描述3.2思路分析3.3代码实现 四、高精度加法核心…

SpringBoot实战(十八)集成Feign

目录 一、简介1.定义2.关键特征 二、Maven依赖三、编写代码1.DemoController.java2.DemoFeignClient.java3.启动类注解 EnableFeignClients 四、测试 一、简介 1.定义 OpenFeign:是由 Netflix 开发的声明式的 Web 服务客户端。它简化了向 RESTful Web 服务发送 HT…

python接口自动化(八)--发送post请求的接口(详解)

简介 上篇介绍完发送get请求的接口,大家必然联想到发送post请求的接口也不会太难,被聪明的你又猜到了。答案是对的,虽然发送post请求的参考例子很简单,但是实际遇到的情况却是很复杂的,因为所有系统或者软件、网站都是…

HOT31-K个一组翻转链表

leetcode原题链接:K个一组翻转链表 题目描述 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余…

html实现酷炫好看的个人介绍主页(附源码)

文章目录 1.设计来源1.1 主界面1.2 我的简介界面1.3 教育经历界面1.4 我的源码界面1.5 我的相册界面1.6 朋友评价界面1.7 热门文章界面1.8 联系我界面 2.效果和源码2.1 动态效果2.2 源代码2.3 代码目录 源码下载 作者:xcLeigh 文章地址:https://blog.csd…

vue3使用高德地图实现点击获取经纬度以及搜索功能

话不多说直接上干活 在此之前你需要有高德地图的 key&#xff0c;这个自己去申请即可 1&#xff0c;首先需要在终端安装 npm i amap/amap-jsapi-loader --save 2&#xff0c;准备一个容器 <template><div id"container"></div> </templat…

Python 识别拼图验证码

需要识别的某易易盾验证码如下: 识别过程也是非常简单,使用现成的拼图库就行,本文记录一下使用心得(其实也没啥心得,开箱即用,太简单了): 首先,下载gaps拼图库 Install requirements: $ pip install -r requirements.txt $ sudo apt-get install python-tkInstall …

爱奇艺数据湖实战-广告数据湖应用

01 背景 广告数据主要包括效果、品牌和ADX等广告形式的请求和投放链路中产出的一系列日志&#xff0c;经过处理后&#xff0c;用于算法模型训练、广告运营分析、广告投放决策等场景。广告业务对数据的时效性、准确性以及查询性能要求较高。目前&#xff0c;广告数据链路整体采用…

【C语言扫雷的显微镜级别讲述】

C语言扫雷的显微镜级别讲述 分析 很久之前写过这个 现在做一个详细复述从源头出发 首先我们想写扫雷 最基本的框架 1&#xff08;外部&#xff09;.这个游戏可以玩完之后再玩一次 2.&#xff08;内部&#xff09;首先是要创建一个游戏场地 3.&#xff08;内部&#xff09; 电…

Set 集合

1:特点 无序&#xff1a;存取顺序不一致不重复&#xff1a;可以去除重复无索引&#xff1a;不能使用普通for循环遍历&#xff0c;也不能通过索引来获取元素 2&#xff1a;实现类特点 HashSet&#xff1a; 无序&#xff0c;不重复&#xff0c;无索引LinkedHashSet&#xff1a…

Python3 实例(三) | 菜鸟教程(二十一)

目录 一、Python 二分查找 二、Python 线性查找 三、Python 插入排序 四、Python 快速排序 五、Python 选择排序 六、Python 冒泡排序 七、Python 归并排序 一、Python 二分查找 &#xff08;一&#xff09;二分搜索是一种在有序数组中查找某一特定元素的搜索算法。 &a…

手写map

目录 背景过程简介手写HashMap4、put方法5、get方法5、remove方法 总结 背景 让我们来了解一下HashMap吧 过程 简介 HashMap是Java中一中非常常用的数据结构&#xff0c;也基本是面试中的“必考题”。它实现了基于“K-V”形式的键值对的高效存取。JDK1.7之前&#xff0c;Ha…

Docker容器的tomcat安装后访问报404页面的解决办法

上次我们创建的tomcat容器访问的时候是404页面,是因为高版本的并没有把默认的页面放到webapps目录下,这时,就需要我们登录创建的tomcat容器了 登录tomcat容器: docker exec -it my_tomcat /bin/bash 查看当前目录: ls 将webapp.dist下的默认页面复制到webapps目录下: cp …

unity3d:YooAsset零冗余构建Assetbundle代码分析

BuildAssetInfo构建asset信息 1.每个收集器下asset会构建出BuildAssetInfo&#xff0c;这种asset是没有冗余&#xff0c;只有依赖列表 2.每个依赖asset会构建出BuildAssetInfo&#xff0c;会记录将要打入的bundle列表 依赖的Asset列表 这个asset依赖的其他asset列表&#xf…

Tree 树结构

Case 1st 最少的摄像头——亚马逊面试问题 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄像机都可以监视其父级、自身及其直接子级。 计算监视树的所有节点所需的最小摄像机数。 例&#xff1a; Input: [0,0,null,0,0]Output: 1Explanation: One cam…

asp.net宠物购物商城系统MyPetShop

asp.net宠物购物商城系统 在线购物网站&#xff0c;电子商务系统 主要技术&#xff1a; 基于asp.net架构和sql server数据库 功能模块&#xff1a; 用户可以购买宠物&#xff0c;查看订单记录 修改密码等 运行环境&#xff1a; 运行需vs2013或者以上版本&#xff0c;sql serv…

183 · 木材加工

链接&#xff1a;LintCode 炼码 - ChatGPT&#xff01;更高效的学习体验&#xff01; 题解&#xff1a;九章算法 - 帮助更多程序员找到好工作&#xff0c;硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧 class Solution { public:/*** param l: Given n pieces of wood wi…

Java8 Stream详解

Stream类继承关系 前置知识 Spliterator接口使用 Spliterator是在java 8引入的一个接口&#xff0c;它通常和stream一起使用&#xff0c;用来遍历和分割序列。 只要用到stream的地方都需要Spliterator&#xff0c;比如List&#xff0c;Collection&#xff0c;IO channel等等…

大语言模型的百家齐放

基础语言模型 概念 基础语言模型是指只在大规模文本语料中进行了预训练的模型&#xff0c;未经过指令和下游任务微调、以及人类反馈等任何对齐优化。 如何理解 只包含纯粹的语言表示能力,没有指导性或特定目标。 只在大量无标注文本上进行无监督预训练,用于学习语言表示。 …