字节青训营——秒杀系统设计学习笔记(三)

news2024/11/6 3:02:09

限流算法

限流顾名思义,就是对请求或并发数进行限制;通过对一个时间窗口内的请求量进行限制来保障系统的正常运行。如果我们的服务资源有限、处理能力有限,就需要对调用我们服务的上游请求进行限制,以防止自身服务由于资源耗尽而停止服务

在限流中有两个概念需要了解。

  • 阈值:在一个单位时间内允许的请求量。如 QPS限制为10,说明 1 秒内最多接受 10 次请求。
  • 拒绝策略:超过阈值的请求的拒绝策略,常见的拒绝策略有直接拒绝、排队等待等。

限流就是控制网络接口发送或接收请求的速率,它可防止DoS攻击和限制Web爬虫

1. 计数器(固定窗口)算法

计数器算法是使用计数器在周期内累加访问次数,当达到设定的限流值时,触发限流策略。下一个周期开始时,进行清零,重新计数。

此算法在单机还是分布式环境下实现都非常简单,使用redis的incr原子自增性和线程安全即可轻松实现

在这里插入图片描述

这个算法通常用于QPS限流和统计总访问量,对于秒级以上的时间周期来说,会存在一个非常严重的问题,那就是临界问题

假设1min内服务器的负载能力为100,因此一个周期的访问量限制在100,然而在第一个周期的最后5秒和下一个周期的开始5秒时间段内,分别涌入100的访问量,虽然没有超过每个周期的限制量,但是整体上10秒内已达到200的访问量,已远远超过服务器的负载能力,由此可见,计数器算法方式限流对于周期比较长的限流,存在很大的弊端。

优缺点:

  • 优点:简单粗暴,单机在 Java 中可用 Atomic 等原子类、分布式就 Redis incr。
  • 缺点:假设我们允许的阈值是1万,此时计数器的值为0, 当1万个请求在前1秒内一股脑儿的都涌进来,这突发的流量可是顶不住的。缓缓的增加处理和一下子涌入对于程序来说是不一样的。

2. 滑动窗口算法

滑动时间窗口,又称rolling window.为了解决计数器法统计精度太低的问题,引入了滑动窗口算法,滑动窗口算法是将时间周期分为N个小周期,分别记录每个小周期内访问次数,并且根据时间滑动删除过期的小周期。下面这张图,很好地解释了滑动窗口算法:

在这里插入图片描述

由此可见,当滑动窗口的格子划分的越多,那么滑动窗口的滚动就越平滑,限流的统计就会越精确

注:并没有完全解决临界问题,只是降低了临界问题的发生概率,提高了限流的准确率;

优缺点:

  • 优点:一定程度上提高了限流的准确率,窗口越小,准确率越高;
  • 缺点:但是滑动窗口和固定窗口都无法解决短时间之内集中流量的突击

3. 漏桶算法

接下来再说说漏桶,它可以解决时间窗口类的痛点,使得流量更加的平滑

漏桶算法是访问请求到达时直接放入漏桶,如当前容量已达到上限(限流值),则进行丢弃(触发限流策略)。漏桶以固定的速率进行释放访问请求(即请求通过),直到漏桶为空。

在这里插入图片描述

优缺点:

  • 优点:让流量处理平滑,无论任何时候都是按照固定速率处理请求
  • 缺点:上面的优点是优点也是缺点,面对突发请求,服务的处理速度和平时是一样的,这其实不是我们想要的,在面对突发流量我们希望在系统平稳的同时,提升用户体验即能更快的处理请求,而不是和正常流量一样,循规蹈矩的处理

4. 令牌桶算法

令牌桶算法是对漏斗算法的一种改进,除了能够起到限流的作用外,还允许一定程度的流量突发

令牌桶算法是程序以r(r=时间周期/限流值)的速度向令牌桶中增加令牌,直到令牌桶满,请求到达时向令牌桶请求令牌,如获取到令牌则通过请求,否则触发限流策略

在这里插入图片描述

可以看出令牌桶在应对突发流量的时候,桶内假如有 100 个令牌,那么这 100 个令牌可以马上被取走,而不像漏桶那样匀速的消费。所以在应对突发流量的时候令牌桶表现的更佳

5. 小结

计数器 VS 滑动窗口:

  1. 计数器算法是最简单的算法,可以看成是滑动窗口的低精度实现。
  2. 滑动窗口由于需要存储多份的计数器(每一个格子存一份),所以滑动窗口在实现上需要更多的存储空间
  3. 也就是说,如果滑动窗口的精度越高,需要的存储空间就越大。

漏桶算法 VS 令牌桶算法:

  1. 漏桶算法和令牌桶算法最明显的区别是令牌桶算法允许流量一定程度的突发
  2. 因为默认的令牌桶算法,取走token是不需要耗费时间的,也就是说,假设桶内有100个token时,那么可以瞬间允许100个请求通过。
  3. 当然我们需要具体情况具体分析,只有最合适的算法,没有最优的算法。

参考:http://t.csdn.cn/3Faw9

http://t.csdn.cn/GIJvN

CDN学习

1. 简介

CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要包括了节点调度、节点负载均衡和内容存储、分发、管理技术。

CDN的优势很明显:

  • CDN节点解决了跨运营商和跨地域访问的问题,访问延时大大降低
  • 大部分请求在CDN边缘节点完成,CDN起到了分流作用,减轻了源站的负载

2.工作流程

CDN加速前

使用CDN加速前,用户侧发起的请求通过用户侧DNS递归到网站DNS解析以后,最终用户侧直接请求网站服务器。这里可能会造成以下几种情况:

img

CDN加速后

CDN通过在现有网络中增加一层新的缓存节点,将源站的资源发布到最接近用户的网络节点,使得客户端在请求时直接访问到就近的CDN节点并命中该资源,减少回源情况,提高网站访问速度

阿里云CDN缓存节点可分为L1节点(一级节点)和L2节点(二级节点),请求的流程是:客户端–>CDN_L1–>CDN_L2–>源站。CDN的L1节点分布在全国各省市,L2节点分布在几个大区下,可以把L2节点理解为汇聚式节点,简单架构如下图所示。

img

浏览器本地缓存失效后,浏览器会向CDN边缘节点发起请求。类似浏览器缓存,CDN边缘节点也存在着一套缓存机制。

CDN缓存策略(重点)

CDN边缘节点缓存策略因服务商不同而不同,但一般都会遵循http标准协议,通过http响应头中的Cache-control: max-age的字段来设置CDN边缘节点数据缓存时间。

当客户端向CDN节点请求数据时,CDN节点会判断缓存数据是否过期,若缓存数据并没有过期,则直接将缓存数据返回给客户端;否则,CDN节点就会向源站发出回源请求,从源站拉取最新数据,更新本地缓存,并将最新数据返回给客户端。

CDN缓存刷新

CDN边缘节点对开发者是透明的,相比于浏览器Ctrl+F5的强制刷新来使浏览器本地缓存失效,开发者可以通过CDN服务商提供的“刷新缓存”接口来达到清理CDN边缘节点缓存的目的。这样开发者在更新数据后,可以使用“刷新缓存”功能来强制CDN节点上的数据缓存过期,保证客户端在访问时,拉取到最新的数据

CDN工作原理

通过以下案例,可以进一步了解CDN的工作原理。
假设加速域名为www.a.com, 接入CDN网络,开始使用加速服务后,当终端用户(北京)发起HTTP请求时,处理流程如下图所示。

img

3. 什么资源可以被加速

在HTTP请求的资源,请求可以分为静态请求和动态请求。

静态请求

静态请求是指在不同请求中访问到的数据都相同的静态文件。例如:图片、视频、网站中的文件(html、css、js)、软件安装包、apk文件、压缩包文件等。

CDN加速的本质是缓存加速,将您服务器上存储的静态内容缓存在阿里云CDN节点上,当您访问这些静态内容时,无需访问服务器源站,就近访问阿里云CDN节点即可获取相同内容,从而达到加速的效果,同时减轻服务器源站的压力。

动态请求(不适用)

动态请求是指在不同请求中访问到的数据不相同的动态内容。例如:网站中的文件(asp、jsp、php、perl、cgi)、API接口、数据库交互请求等。

当客户端访问这些动态内容时,每次都需要访问用户的服务器,由服务器动态生成实时的数据并返回给客户端。因此CDN的缓存加速不适用于加速动态内容,CDN无法缓存实时变化的动态内容。对于动态内容请求,CDN节点只能转发回源站服务器,没有加速效果。

如果用户的网站或App应用有较多动态内容,例如需要对各种API接口进行加速,则需要使用阿里云全站加速产品。全站加速能同时加速动态和静态内容,加速方式如下:

  • 静态内容使用CDN加速。
  • 动态内容通过阿里云的路由优化、传输优化等动态加速技术以最快的速度访问您的服务器源站获取数据。从而达到全站加速的效果

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

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

相关文章

JavaSE学习day7_02 封装和构造方法

4. 封装 面向对象的三大特征: 封装、继承、多态 封装:对象代表什么,就得封装对应的数据,并提供数据对应的行为。 比如人画圆:”画“这个行为应该封装在圆这个类,为什么?因为”画“圆要知道圆…

Pandas基础与实例——人工智能基础

本文目录一、 Series1. 将列表强转为Series2. 将字典强转为Series3. 访问Series中的数据3.1 第一套检索方法3.2 第二套检索方法4. Series常用属性二、Pandas日期类型数据处理1. 将字符串转为datetime类型2. 与1等价的方式3. 单独取出年月日4. 日期运算5. 生成一组日期6. 生成工…

AJAX笔记(二)Fetch和axios

1、Fetch 1.1、XMLHttpRequest的缺陷 1.2、fetch的get写法 1.3、fetch的post写法 1.4、fetch的put写法 1.5、fetch的patch写法 1.6、fetch的delete写法 2、axios 2.1、axios的介绍 2.2、axios的get写法 2.3、axios的post写法(图一json写法和图二三form写法&#x…

Django项目部署-uWSGI

Django项目部署-uWSGIDjango运维部署框架整体部署架构web服务器与web应用服务器的区别部署环境准备安装python3安装mariadb安装Django和相关模块Django托管服务器uWSGI使用uWSGI配置使用Django运维部署框架 整体部署架构 操作系统: Linux 。优势:生态系统丰富&…

NC113 验证IP地址

验证IP地址_牛客题霸_牛客网 描述 编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址 IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(".")分割。比如,172.16.254.1&#…

苹果手机怎么下载手机铃声?图文教程,快速学会

很多小伙伴喜欢使用苹果手机,可是苹果手机里的铃声自己并不是很喜欢听,想要下载一些好听的歌曲更换自己的手机铃声。苹果手机怎么下载手机铃声?别着急,今天小编以图文的方式,教教大家如何使用苹果手机下载手机铃声。 苹…

验证码绕过与识别

目录 验证码绕过 前言 删除cookie绕过 未销毁复用验证码 验证码识别 工具 使用流程 验证码绕过 前言 之前pikachu靶场有两道验证码绕过的题目,分别是(on client 前端验证验证码)和(on server 未销毁复用验证码),具体见下面的文章 Pikachu靶场…

IDEA热部署JRebel 插件

JRebel 是什么? 在我们的日常开发工作中,一般是都是 IDEA + Tomcat 部署运行 web 项目。项目运行之后,如果你修改了 Java 代码,想要生效就必须得重启 Tomcat 服务器才行。改一次代码就要重启一次,真的是太麻烦了,这会严重影响我们的开发效率。 那么有没有什么办法让我们不…

c语言入门-4-常量

c-常量正文字面常量1、字面常量2、const修饰的常变量3、#define 定义的标识符常量4、 枚举常量深度解析1 什么是常量2 常变量为什么不能定义数组的长度3 枚举的作用是什么4、C语言为何需要枚举?下一篇正文 变得量叫变量,不变的量叫常量 字面常量 1、字…

1. QSaveFile和QFile的简单使用

1. 说明 QSaveFile和QFile两个类都是用来操作文件的,区别在于QSaveFile在对文件进行写入时有一种保护机制,再写入出错时,不会对源文件中的内容进行操作。该类在执行写操作时,会先将内容写入到一个临时文件中,如果没有…

Flink Checkpoint 中的Aligned Checkpoint 和 Unaligned Checkpoint

文章目录知识点反压CheckpointBarrierAligned CheckpointUnaligned Checkpoint核心思想实现原理UC同步阶段UC异步阶段知识点 反压 反压是流式系统中关于处理能力的动态反馈机制,并且是从下游到上游的反馈,一般是在实时数据处理的过程中,上游…

Java POI导出之数据验证

Java POI导出之数据验证 maven 依赖 这里用的是apache.poi, 没有使用EasyExcel <!-- poi依赖--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.1</version></dependency&…

如何运维多集群数据库?58 同城 NebulaGraph Database 运维实践

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SktQW2qn-1676450580889)(https://www-cdn.nebula-graph.com.cn/nebula-website-5.0/images/blogs/58.%20Com%20Inc/58%E5%90%8C%E5%9F%8E_%E7%94%BB%E6%9D%BF%201.jpg)] 图计算业务背景介绍 我们为什…

jsp游戏门户网站系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp 游戏门户网站系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;使…

简单易用的图片缩略图处理库

哈喽&#xff0c;大家好&#xff0c;我是源小北。 最近在工作中&#xff0c;刚好有遇到对图片进行缩放处理的功能。于是&#xff0c;便拿起很久以前使用过的Java原生工具类处理图片&#xff0c;不过在开发过程中也发现了一些问题。 在Java中&#xff0c;原生的处理图片缩略图…

浅聊一下,可中断锁(ReentrantLock)

前言 今天早上上厕所&#xff0c;上的我痔疮犯了&#xff0c;屁股一坐下去就感觉一根针在刺我&#xff0c;得的是外痔&#xff0c;之前还坚持用痔疮膏来着&#xff0c;但是感觉涂药的那个姿势以及位置我实在无法忍受&#xff0c;就把它给断了&#xff0c;到头来还是屁股糟了罪&…

工程监测多通道振弦模拟信号采集仪VTN参数修改

工程监测多通道振弦模拟信号采集仪VTN参数修改 1 使用按键修改参数 使用按键修改某个参数的方法如下&#xff1a; &#xff08;1&#xff09;在系统参数查看页面&#xff08;PXX 页面&#xff09;&#xff0c;按【SWITCH】或【SETTING】按键切换到要修改的参数项。 &#xff08…

蓝库云|8项关键让你看透企业「数字转型」,零代码是惊喜

各行各业都要面对的多方竞争力及不断上涨的经营成本&#xff0c;以及随着时代的发展&#xff0c;有不少企业纷纷推动数字化转型&#xff0c;考虑藉着应用现代化的数据和科技工具的结合&#xff0c;协助企业创造新的营运模式及收入来源&#xff0c;以提升自动化效率、优化客户体…

用于非线性时间序列预测的稀疏局部线性和邻域嵌入(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

SpringBoot 文件上传后查看404的问题和解决404后需要访问两次才能查看的问题

文件上传、图片上传的实现见这个&#xff1a; SpringBootVue 实现头像上传功能_Teln_小凯的博客-CSDN博客 在实现上面的功能后&#xff0c;发现查看图片的时候提示404&#xff0c;解决这个方法如下&#xff1a; 1、配置资源静态文件映射 第一个参数是页面请求的地址&#x…