透明多级分流系统(用户端缓存和负载均衡)

2024-03-06 23:04

本文主要是介绍透明多级分流系统(用户端缓存和负载均衡),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

部件考虑

有些设备位于客户端或者网络边缘,能够迅速响应用户请求,避免给cpu和数据库带来压力,比如,本地缓存,内容分发网络,反向代理等。
有些设备处理能力能够线性扩展,易于伸缩,应尽量作为业务主体,如集群能够扩展的服务节点
有些设备对系统有全局性影响,需要时刻保持容错备份,比如服务注册中心,配置中心。
有些是单点设备,比如系统路由,网关,数据库等。
对系统进行流量规划时,应该考虑到部件特性

规划原则

尽量减少单点部件,尽量减少到达单点部件的流量

最简单的系统就是最好的系统

客户端缓存

服务器对于客户端请求的响应中附带一些条件,要求客户端在想要发出相同请求时,先判断是否满足条件,如果满足,就直接使用上一次服务器给予的响应来替代,不必重新访问。
通过不同条件,客户端缓存又分为:强制缓存和协商缓存

强制缓存

比如收到请求的10分钟内有效,那么除了用户主动刷新页面,对于新开窗口,浏览器地址输入,前进,后退均可生效。

HTTP的Header参数实现强制缓存

Expires

Header参数是一个截止时间参数。
问题:
受限客户端时间。
无法描述不缓存。
无法让私有资源不被代理服务器,内容分发网络缓存。

Cache-Control

如果expire和cache-control起冲突,会以cache-control为准。
参数:

  • max-age和s-maxage:缓存有效时间,以秒为单位,s-maxage的s是share的缩写,意味着在CDN,代理中持有缓存的有效时间。
  • public和private:private不允许CDN等缓存。
  • no-cache:不缓存

协商缓存

需要浏览器和服务器协商一次,检查客户端的资源是否过期了,会有另外的开销。和强制缓存是并行运行的。
有两种检查资源是否过期的模式:根据修改时间,根据资源唯一标识是否发生变化。他们都是通过一组成对出现的Header来实现的。

Last-Modified和IF-Modified-Since

服务端返回资源会带上Last-Modified的Header,客户端下一次请求相同资源时,就会带上IF-Modified-Since(即获得资源的Last-Modified),如果服务器发现这段时间没有修改,就返回304/Not Modified,无消息体,从而节省流量。

ETage和If-None-Match

ETage代表资源的唯一标识,相比于Modified更精密,因为modified是秒级。
但是通过哈希算ETage也会消耗资源。

传输链路

基于传输链路的设计原则:

  1. 减少请求数量,因为每个http请求都需要建立tcp连接。
  2. 扩大浏览器的并发请求,现代浏览器一般支持6个对于相同域名的并发请求,通过将资源分布在不同域名上,从而实现并发请求。
  3. 压缩传输

tcp连接复用

HTTP/2支持了每个域名维持一个TCP连接,一个HTTP响应当作一个个流,每个数据帧带有流ID,根据流ID可以在浏览器将数据帧重新组装成一个完整的HTTP响应。
对于小而多的文件,一个tcp好用(HTTP2),但是对于大文件,不如多tcp连接快。

压缩HTTP响应

域名解析是透明多级分流系统中重要的环节

DNS查询“icyfenix.cn"
DNS服务返回一个CNAME,”icyfenix.cn.cdn.dnsv1.com“。
递归查询CNAME,返回”icyfenix.cn"的全部的全国的DNS地址。

典型的 CDN 部署中,第一次 DNS 查询是为了获取 CDN 的 DNS 服务器地址,而第二次 DNS 查询则是通过 CDN 的 DNS 服务器获取实际的 IP 地址,CDN的DNS服务器会根据用户的位置等信息返回最优的CDN服务器地址,它可能是一个也可能是一组。

内容分发网络:CDN

仅从网络传输的角度看,一个互联网系统的速度取决于这四点:

  • 网站服务器接入网络运营商的链路所能提供的出口带宽。
  • 用户客户端接入网络运营商的链路所能提供的入口带宽。
  • 从网站到用户所经过的不同运营商之间的带宽。
  • 从网站到用户的物理链路传输时延。
    除了第二条,其他都可以通过CDN实现。

内容分发:CDN获取源站资源的方式

在DNS服务器的协助下,无论是用户还是服务器,内容分发网络都完全是透明的,在两者不知亲的情况下,由CDN节点接管了用户向服务器发出的资源请求。
这其中的问题就是,CDN节点中必须有用户要的资源,其中包括两个内容”如何获取源资源“,”如何保证资源是最新的“。
CDN获取源站资源的方式就叫做内容分发。
主要有两种方式:

  • 源站主动分发(Push),预加载。
  • CDN被动回源(Pull)

CDN的应用

CDN能做的事情:

  • 加速静态资源分发
  • 安全防御,如果只使用CDN,而隐藏服务器的IP,恶意攻击就无法触及到服务器。
  • 状态缓存
  • 修改资源的内容,比如可以压缩,修改Header参数等。

负载均衡:就是将进入网关的流量合理分配给多个服务器

经历过“域名”-“CNAME”-“最优CDN地址”(这个是DNS的负载均衡),在网络边缘的CDN才进行负载均衡(这是网关层面的负载均衡)。
无论在网关内部建立了多少层负载均衡,从形式上也只能分为两种:四层负载均衡和七层负载均衡,层是对OSI网络模型来说的。

四层负载均衡(链路层的负载均衡)

修改MAC地址在链路层分流

特点是维持同一个TCP连接。
请求进入负载均衡器中,通过修改请求帧的MAC地址,在局域网内将请求送到服务器,由于帧的用户信息没变,服务器直接对用户响应。
想要实现的话需要服务器写入响应的ip地址和负载均衡器的相同,因为这样用户才能判断是自己发出的那个请求的响应。

IP隧道协议在网络层分流

网关给用户的请求再次封装,目标ip为服务器地址,服务器接收到后进行两次拆包,直接给用户响应。
要求服务器写入响应的ip地址和网关的相同。

通过修改请求的ip让服务器和网关通信,然后网关和用户通信

会带来较大的性能损失

七层负载均衡(应用层)

四层的负载均衡使用的都是一个数据帧,也就是通过修改帧的内容来实现的(即维持一个TCP连接)。
应用层的负载均衡需要网关和用户建立TCP,网关和服务器建立TCP,性能一定比不了四层。
七层代理的强大功能:

  • CDN能做的,它都能做,静态资源缓存,安全防护等等。
  • 更智能化的路由
  • 微服务的治理很多都在七层实现

负载均衡的算法策略

  • 轮询
  • 权重轮询
  • 随机均衡
  • 权重随机
  • 哈希MAC或者IP
  • 测试服务器的响应速度进行均衡
  • 最少连接均衡(通过记录服务器连接数)

这篇关于透明多级分流系统(用户端缓存和负载均衡)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/781646

相关文章

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

linux系统中java的cacerts的优先级详解

《linux系统中java的cacerts的优先级详解》文章讲解了Java信任库(cacerts)的优先级与管理方式,指出JDK自带的cacerts默认优先级更高,系统级cacerts需手动同步或显式... 目录Java 默认使用哪个?如何检查当前使用的信任库?简要了解Java的信任库总结了解 Java 信

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方

Redis高性能Key-Value存储与缓存利器常见解决方案

《Redis高性能Key-Value存储与缓存利器常见解决方案》Redis是高性能内存Key-Value存储系统,支持丰富数据类型与持久化方案(RDB/AOF),本文给大家介绍Redis高性能Key-... 目录Redis:高性能Key-Value存储与缓存利器什么是Redis?为什么选择Redis?Red

React 记忆缓存的三种方法实现

《React记忆缓存的三种方法实现》本文主要介绍了React记忆缓存的三种方法实现,包含React.memo、useMemo、useCallback,用于避免不必要的组件重渲染和计算,感兴趣的可以... 目录1. React.memo2. useMemo3. useCallback使用场景与注意事项在 Re

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环