加入收藏 | 设为首页 | 会员中心 | 我要投稿 天津站长网 (https://www.022zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 资讯 > 正文

如何设计一个高可用程序?要考虑哪些地方?

发布时间:2021-11-11 14:56:13 所属栏目:资讯 来源:互联网
导读:一篇短小的文章,面试经常遇到的这个问题。本文主要包括下面这些内容: 高可用的定义 哪些情况可能会导致系统不可用? 有些提高系统可用性的方法?只是简单的提一嘴,更具体内容在后续的文章中介绍,就拿限流来说,你需要搞懂:何为限流?如何限流?为什么要限

  一篇短小的文章,面试经常遇到的这个问题。本文主要包括下面这些内容:
 
  高可用的定义
 
  哪些情况可能会导致系统不可用?
 
  有些提高系统可用性的方法?只是简单的提一嘴,更具体内容在后续的文章中介绍,就拿限流来说,你需要搞懂:何为限流?如何限流?为什么要限流?如何做呢?说一下原理?。
 
  什么是高可用?可用性的判断标准是啥?
 
  高可用描述的是一个系统在大部分时间都是可用的,可以为我们提供服务的。高可用代表系统即使在发生硬件故障或者系统升级的时候,服务仍然是可用的。
 
  一般情况下,我们使用多少个 9 来评判一个系统的可用性,比如 99.9999% 就是代表该系统在所有的运行时间中只有 0.0001% 的时间都是可用的,这样的系统就是非常非常高可用的了!当然,也会有系统如果可用性不太好的话,可能连 9 都上不了。
 
  哪些情况会导致系统不可用?
 
  黑客攻击;
 
  硬件故障,比如服务器坏掉。
 
  并发量/用户请求量激增导致整个服务宕掉或者部分服务不可用。
 
  代码中的坏味道导致内存泄漏或者其他问题导致程序挂掉。
 
  网站架构某个重要的角色比如 Nginx 或者数据库突然不可用。
 
  自然灾害或者人为破坏。
 
  ......
 
  有哪些提高系统可用性的方法?
 
  1. 注重代码质量,测试严格把关
 
  我觉得这个是最最最重要的,代码质量有问题比如比较常见的内存泄漏、循环依赖都是对系统可用性极大的损害。大家都喜欢谈限流、降级、熔断,但是我觉得从代码质量这个源头把关是首先要做好的一件很重要的事情。如何提高代码质量?比较实际可用的就是 CodeReview,不要在乎每天多花的那 1 个小时左右的时间,作用可大着呢!
 
  另外,安利这个对提高代码质量有实际效果的宝贝:
 
  sonarqube :保证你写出更安全更干净的代码!(ps: 目前所在的项目基本都会用到这个插件)。
 
  Alibaba 开源的 Java 诊断工具 Arthas 也是很不错的选择。
 
  IDEA 自带的代码分析等工具进行代码扫描也是非常非常棒的。
 
  2.使用集群,减少单点故障
 
  先拿常用的 Redis 举个例子!我们如何保证我们的 Redis 缓存高可用呢?答案就是使用集群,避免单点故障。当我们使用一个 Redis 实例作为缓存的时候,这个 Redis 实例挂了之后,整个缓存服务可能就挂了。使用了集群之后,即使一台 Redis 实例,不到一秒就会有另外一台 Redis 实例顶上。
 
  3.限流
 
  流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。——来自 alibaba-Sentinel 的 wiki。
 
  4.超时和重试机制设置
 
  一旦用户请求超过某个时间的得不到响应,就抛出异常。这个是非常重要的,很多线上系统故障都是因为没有进行超时设置或者超时设置的方式不对导致的。我们在读取第三方服务的时候,尤其适合设置超时和重试机制。一般我们使用一些 RPC 框架的时候,这些框架都自带的超时重试的配置。如果不进行超时设置可能会导致请求响应速度慢,甚至导致请求堆积进而让系统无法在处理请求。重试的次数一般设为 3 次,再多次的重试没有好处,反而会加重服务器压力(部分场景使用失败重试机制会不太适合)。

(编辑:天津站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读