[系统架构分析师]架构设计篇

绫波波 发布于 2024-11-03 1216 次阅读


缓存技术对比【MemCache和Redis】

工作 MemCache Redis
数据类型 简单key/value结构 丰富的数据结构
持久性 不支持 支持
分布式存储 客户端哈希分片/一致性分片 多种方式,主从、Sentinel、Cluster等
多线程支持 支持 支持(5.0版本之前不支持)
内存管理 私有内存池/内存池
事务支持 不支持 有限支持
数据容灾 不支持,不能做数据恢复 支持,可以在灾难发生时,恢复数据

Redis分布式存储方案

Redis数据类型

类型 特点 示例
String 存储二进制,任何类型数据,最大512MB 缓存、计数、共享Session
Hash(字典) 无序字典,数组+链表,适合存对象。Key对应一个HashMap,针对一组数据 存储、读取、修改用户属性
List(列表) Linked List:双向链表,有序,增删快,查询慢。
Array List:数组方式,有序,增删慢,查询快
消息队列,文章列表,记录前N个最新登录的用户ID列表
Set(集合) 键值对无序、唯一
增删查复杂度均为O(1),支持交/并/差操作
独立IP,共同爱好,标签
Sorted Set(有序集合) 键值对有序,唯一,自带按权重排序效果 排行榜

Redis数据淘汰算法

Redis的持久化

Redis支持持久化的方式主要有两种:RDB和AOF
RDB:传统数据库中快照的思想。指定时间间隔将数据进行快照存储
AOF:传统数据库中日志的思想。把每条改变数据集的命令追加到AOF文件末尾,这样出现问题时,可以重新执行AOF文件中的命令来重建数据集。

Redis常见问题

缓存雪崩

大部分缓存失效导致数据库崩溃
解决方法:

  • 使用锁或队列:保证不会有大量线程对数据库进行一次性的读写,从而避免失效时大量的并发请求货到底层数据存储系统上。
  • 为key设置不同的缓存失效时间:在固定的一个缓存时间的基础上+随机一个时间作为缓存失效时间
  • 二级缓存:设置一个有时间限制的缓存+一个无时间限制的缓存,避免大规模访问数据库。
缓存穿透

查询无数据返回->直接查数据库

  • 如果查询结果为空,直接设置一个默认值存放到缓存,这样第二次到缓存中获取就有值了。设置一个不超过5分钟的过期时间,以便能正常更新缓存
  • 设置布隆过滤器,将所有可能存在的数据哈希 到一个足够大的bitmap中,一个一定不存在的数据就会被这个bitmap拦截掉,从而避免对底层存储系统的查询压力

布隆过滤器用于快速识别1个元素不在一个集合中。通过一个长二进制向量和一系列随机映射函数来记录和识别某个数据是否在一个集合中。

优点:

  • 占用内存小
  • 查询效率高
  • 不需要存储元素本身,在某些对保密要求比较严格的场合有很大优势。

缺点:

  • 有一定的误判率,即存在假阳性,不能准确判断元素是否在集合中
  • 一般情况下不能从布隆过滤器中删除元素
  • 不能获取元素本身
缓存预热

系统上线后,将相关需要缓存数据直接加到缓存系统中。
解决方案:

  • 直接写个缓存刷新页面,上线时手工操作。
  • 数据量不大时,可以在项目启动的时候自动进行加载
  • 定时刷新缓存。
缓存更新

除Redis系统自带的缓存失效策略,常见采用以下两种:

  • 定期清理过期的缓存
  • 当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存
缓存降级

降级的目的是为了保证核心服务可用,即使是有损的,而且有些服务是无法降级的,如电商的购物流程等。
在降级前要对系统进行梳理,从而梳理出哪些必须保护,哪些可以降级

负载均衡技术

应用层负载均衡

  • http重定向。HTTP重定向就是应用层的请求转发。用户的请求其实已经到了HTTP重定向负载均衡服务器,服务器根据算法要求用户重定向,用户收到重定向请求后,再次请求真正的集群。实现简单,但是性能较差
  • 反向代理服务器:在用户的请求到达反向代理服务器时(已经到达网站机房),由反向代理服务器根据算法转发到具体的服务器。常用的apache、nginx都可以充当反向代理服务器。部署简单,但是代理服务器可能成为性能的瓶颈。

传输层负载均衡

DNS域名解析负载均衡。DNS域名解析负载均衡就是在用户请求DNS服务器,获取域名对应的IP地址时,DNS服务器直接给出负载均衡后的服务器IP。
特点:效率比HTTP重新定向高,减少维护负载均衡服务器的成本。但一个应用服务器故障,不能及时通知DNS,而且DNS负载均衡的控制权在域名服务商,网站无法做更多的改善和更强大的管理。
基于NAT的负载均衡。基于NAT的负载均衡将一个外部IP地址映射为多个IP地址,对每次连接请求动态的转换为一个内部节点的地址。
特点:技术较为成熟,一般在网关位置,可以通过硬件实现。像四层交换机一般就采用了这种技术

负载均衡算法

静态算法(不考虑动态负载)

  • 轮转算法:轮流将服务请求(任务)调度给不同的节点
  • 加权轮转算法:考虑不同节点处理能力的差异
  • 源地址哈希散列算法:根据请求的源IP地址,作为散列键从静态分配的散列表找出对应的节点
  • 目标地址哈希散列算法:根据请求目标IP做散列找出对应的节点
  • 随机算法:随机分配、简单,但是不可控

动态算法(考虑动态负载)

  • 最小连接数算法:新请求分配给当前活动请求数量最少得节点,每个节点处理能力相同的情况下
  • 加权最小连接数算法:考虑节点处理能力不同,按最小连接数分配
  • 加权百分比算法:考虑了节点利用率、硬盘速率、进程个数等,使用利用率来表现剩余处理能力。

硬件负载均衡:F5
软件负载均衡:LVS,Nginx、HAproxy

有状态与无状态

无状态服务(stateless service)对单词请求的处理,不依赖其他请求,也就是说,处理一次请求所需的全部信息,都包含在这个请求里,要么可以从外部获取到,比如说数据库。服务器本身不存储任何信息。
有状态(stateful service)则相反,他会在自身保存一些数据,先后的请求是有关联的。

判断以下构件是有状态服务还是无状态服务:

  • 身份认证构件——有状态
  • 资源发布构件——无状态
  • 资源检索构件——无状态
  • 在线编辑构件——有状态
  • 统计分析构件——无状态

session共享机制

数据库读写分离

主从数据库结构特点:

  • 一般是一主多从,也可以多主多从
  • 主库做写操作,从库做读操作

组从复制步骤:

  • 主库(Master)更新数据完成前,将操作写binlog日志文件。
  • 从库(Slave)打开I/O线程与主库连接,做binlog dump process,并将事件写入中继日志
  • 从库执行中继日志事件,保持与主库一致。

使用反向代理和CDN加速网站响应

CDN(内容分发网络)

CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。

使用分布式文件系统和分布式数据库系统

使用NoSQL和搜索引擎

业务拆分

Web应用服务器

WEB应用服务器可以理解为两层意思:
(1)WEB服务器:其职能较为单一,就是把浏览器发过来的Request请求,返回html页面。
(2)应用服务器:进行业务逻辑的处理,如EJB,Corba。COM+

Apache:Web服务器,市场率占有60%左右。他可以运行在几乎所有的Unix、Windows、Linux系统平台上。
IIS:早期Web服务器,目前小规模站点仍有应用。
Tomcat:开源、运行servlet和JSP Web应用软件的基于Java的Web应用软件容器。
JBOSS:JBOSS是基于J2EE的开放源代码的应用服务器。一般与Tomcat或Jetty绑定使用。
WebSphere:一种功能完善、开放的Web应用程序服务器,他是基于JAVA的应用环境,用于建立、部署和管理Internet和Intranet Web应用程序。
WebLogic:BEA WebLogic Server是一种多功能、基于标准的web应用服务器,为企业构建自己的应用提供了坚实的基础。
Jetty:Jetty是一个开源的servlet容器,他为基于Java的web容器

JWT

JWT(Json Web Token)是一种用于身份验证和授权的开放标准。他是一种轻量级的、基于JSON的令牌,可以在客户端和服务器之间传递消息。
JWT由三部分组成:

  • 【头部】包含令牌类型和所使用的算法
  • 【荷载】包含用户信息和其他元数据
  • 【签名】用于验证令牌的完整性和真实性

JWT的应用场景:【信息交换】【授权】
不需要在服务器端存储状态, 安全的传递非敏感信息

响应式web设计

响应式web设计是一种网页设计布局,其理念是:集中创建页面的图片排版大小,可以智能地根据用户行为以及使用的设备环境进行相应的布局。

方法与策略:

  • 采用流式布局和弹性化设计:使用相对单位,设定百分比而非具体值的方式设置页面元素的大小。
  • 响应式图片:不仅要同比的缩放图片,还要在小设备上降低图片自身的分辨率。

关于中台

中台是一套结合互联网技术和行业特性,将企业核心能力以共享服务形式沉淀,形成“大中台、小前台”的组织和业务机制,供企业快速低成本的进行业务创新的企业架构。中台又可以进一步细分,比如业务中台,数据中台,XX中台。本质上,都是对企业通用进行业务创新的企业架构能力在不同方面的沉淀,并对外能力开放。

【业务中台】:提供重用服务,例如学员中心、课程中心之类的开箱即用可重用能力。
【数据中台】:提供数据整合分析能力,帮助企业从数据中改进学习,调整方向。
【技术中台】:提供技术重用组件能力,帮助解决基础技术平台的复用。如:中间件,分布式存储,AI,负载均衡等基础设施。

判断以下属于业务中台还是数据中台:

  • 多个电商渠道使用一个下单服务,一个订单接口同时为多个前台系统提供服务————业务中台
  • 多个前台系统,根据一个用户的手机号,获取对应的画像、用户的标签————数据中台
  • 将多个支付通道,抽象成一个支付API,暴露给前台业务系————业务中台
  • 通过一个订单编号,来获取可能得商品推荐清单,从而做到交叉销售————数据中台

数据中台必备的4个核心能力

  • 数据汇聚整合能力
  • 数据提纯加工能力
  • 数据服务可视化
  • 价值变现方面

云原生架构原则

  • 服务化原则
  • 弹性原则
  • 可观测原则
  • 韧性原则
  • 所有过程自动化原则
  • 零信任原则
  • 架构持续演进原则

Redis分布式存储

  • 主从模式、
  • 哨兵模式
  • 集群模式
    Redis集群切片的常见方式:
    客户端分片,即在客户端就通过key的hash值对应到不同的服务器
    中间件实现分片。在应用软件和Redis中间,由中间件实现服务到后台Redis节点的路由分派
    客户端服务端写作分片。RedisCluster模式,客户端可采用一致性哈希,服务端提供错误节点的重定向slot上。不同的slot对应到不同的服务器
Talk is cheap, show me the code.
最后更新于 2024-11-03