zoukankan      html  css  js  c++  java
  • 高并发系统设计-笔记


    基础

    1、通用设计方法

    • Scale-out(横向扩展):分而治之是一种常见的高并发系统设计方法,采用分布式部署的方式把流量分流开,让每个服务器都承担一部分并发和流量。

    • 缓存:使用缓存来提高系统的性能,就好比用“拓宽河道”的方式抵抗高并发大流量的冲击。

    • 异步:在某些场景下,未处理完成之前,我们可以让请求先返回,在数据准备好之后再通知请求方,这样可以在单位时间内处理更多的请求。

    2、架构分层

     https://yq.aliyun.com/articles/69327

    高并发系统3个目标: 高性能、高可用、可扩展

    3、 高性能

     从用户使用体验的角度来看,200ms 是第一个分界点:接口的响应时间在 200ms 之内,用户是感觉不到延迟的,就像是瞬时发生的一样。而 1s 是另外一个分界点:接口的响应时间在 1s 之内时,虽然用户可以感受到一些延迟,但却是可以接受的,超过 1s 之后用户就会有明显等待的感觉,等待时间越长,用户的使用体验就越差。所以,健康系统的 99 分位值的响应时间通常需要控制在 200ms 之内,而不超过 1s 的请求占比要在 99.99% 以上。

    吞吐量 = 并发进程数 / 响应时间

    增加系统处理核心数、减少响应时间

    4、高可用

    度量指标

    MTBF(Mean Time Between Failure)是平均故障间隔的意思,代表两次故障的间隔时间,也就是系统正常运转的平均时间。这个时间越长,系统稳定性越高。

    MTTR(Mean Time To Repair)表示故障的平均恢复时间,也可以理解为平均故障时间。这个值越小,故障对于用户的影响越小。

    Availability = MTBF / (MTBF + MTTR)

    一般来说,我们的核心业务系统的可用性,需要达到四个九,非核心系统的可用性最多容忍到三个九。

    设计思路:

    系统设计 - “Design for failure”

    failover(故障转移):

    1. 是在完全对等的节点之间做 failover。
    2. 是在不对等的节点之间,即系统中存在主节点也存在备节点。

    超时控制

    99% 的响应时间

    降级

    保证核心服务的稳定而牺牲非核心服务的做法

    限流

    通过对并发的请求进行限速来保护系统

    系统运维:

    灰度发布、故障演练

      

    5、可扩展 

    拆分 (方式 水平、垂直)

    存储层

    业务层


     演进-数据库:

    池化技术(数据库、线程池)

    依据一些云厂商的 Benchmark 的结果,在 4 核 8G 的机器上运 MySQL 5.7 时,大概可以支撑 500 的 TPS 和 10000 的 QPS

    主从分离

    分库分表

    垂直:业务

    水平 :属性字段

    演进-缓存:

    NoSql

    Redis 、 Hbase 、 mongodb

    缓存策略

    Cache Aside(旁路缓存)策略
    Read/Write Through
    Write Back(写回)策略

    你需要关注缓存命中率这个指标(缓存命中率 = 命中缓存的请求数 / 总请求数)。一般来说,在你的电商系统中,核心缓存的命中率需要维持在 99% 甚至是 99.9%,哪怕下降 1%,系统都会遭受毁灭性的打击。

    缓存高可用方案

    客户端、中间层、服务端

    常用一致性hash

     缺点

    • 缓存节点在圆环上分布不平均,会造成部分缓存节点的压力较大;当某个节点故障时,这个节点所要承担的所有访问都会被顺移到另一个节点上,会对后面这个节点造成压力。严重的会导致雪崩!!! -- 虚拟节点

    • 一致性 Hash 算法的脏数据问题。 -- 设置过期时间、减少节点个数

    缓存穿透

    回种空值

    布隆过滤器(存在误判、不支持删除)

    CDN

    演进-消息队列:

    解耦、异步、消峰

      

    消息丢失

    网络抖动处理:重发
    消息队列服务器宕机:集群
    消息重复:使用唯一 ID 保证消息唯一性。

    kafka 生产端设置ack

    演进-分布式服务:

    微服务改造:

    1 高内聚低耦合
    2 粒度 先粗后细
    3 边迭代边拆分
    4 接口定义可扩展

    PRC框架

    1 高内聚低耦合
    2 粒度 先粗后细
    3 边迭代边拆分
    4 接口定义可扩展

    RPC框架考虑两个问题:
    1 网络传输 - 多路复用
    IO模型 两个阶段
    请求(等待资源) 阻塞非阻塞
    获取(使用资源) 同步异步

    2 序列化
    JSON protobuf thrift

    注册中心

    分布式trace

    traceid spanid

    负载均衡

    静态: 不参考后端服务的状态 轮训、带权重轮训

    动态: 参考后端服务状态 ,选择负载最小、资源最空闲的服务

    网关

    架构模式,将一些服务共有的功能整合在一起,独立部署为单独的一层,解决服务治理的问题

    入口、出口

    性能扩展性:使用多路IO复用和线程池并发处理

    多机房部署:

    问题 数据延迟

    同城双活: 写入跨机房、读取同机房

    异地多活:异步数据同步

    Service Mesh

    SideCar

    istio 数据、控制

    演进-维护:

    服务端监控:

    Google Four Golden Signals:

    延迟 响应时间

    通信 吞吐量

    错误 系统错误

    饱和度 资源使用 cpu 内存 io

    压测

    流程copy、流量染色、影子库、监控熔断

    配置中心

    存储:

    变更通知:轮训-基于md5 长链接

    高可用 : 多级缓存 内存 + 文件 降级方案

    非核心系统故障- 熔断降级

    断路器: 打开 半打开 关闭

    降级: 

    读: 降级数据、降频

    写: 异步写

    限流:

    计数

    滑动窗口

    漏桶:流量整形

    令牌桶:突增流量

    演进-实战:


    实战 

    参考:

    提纲

  • 相关阅读:
    MySQL -- select count(1) 计算一共有多百少符合条件的行
    Python3 -- 文件I/O总结(with、read、write、txt、CSV等)
    Linux -- wget 之 FTP篇
    Linux -- head/tail 查看文件的指定行数
    linux -- 查看linux磁盘容量和文件夹所占磁盘容量
    Linux -- 查询某个文件夹下的文件数量
    Python3 -- 查看python安装路径以及pip安装的包列表及路径
    Python3 --Linux 编码注释# -*- coding:utf-8 -*-
    VisualStudio2013 如何打开之前版本开发的(.vdproj )安装项目
    const int *p与int *const p的区别(转:csdn,suer0101)
  • 原文地址:https://www.cnblogs.com/huilei/p/11752809.html
Copyright © 2011-2022 走看看