大型网站限流算法的实现和改造

news/2024/5/19 9:46:58/文章来源:https://blog.csdn.net/Y0Q2T57s/article/details/82921246

640?wx_fmt=jpeg

最近写了一个限流的插件,所以避免不了的接触到了一些限流算法。本篇文章就来分析一下这几种常见的限流算法

分析之前

  1. 依我个人的理解来说限流的话应该灵活到可以针对每一个接口来做。比如说一个类里面有5个接口,那么我的限流插件就应该能针对每一个接口就行不同的限流方案。所以呢,既然针对的每个接口所以就需要一个可以唯一标示这个接口的key(我取的是类名+方法名+入参)。

  2. 分布式限流强烈推荐使用redis+lua或者nginx+lua来实现。

  3. 这里用2个限流条件来做示例讲一下常见的限流算法:


  1. 接口1它10秒钟最大允许访问100次

  2. 接口2它10秒钟最大允许每个人访问100次。

计数器算法

这个算法可以说是限流算法中最简单的一种算法了。

核心思想

计数器算法的意思呢就是当接口在一个时间单位中被访问时,我就记下来访问次数,直到它访问的次数到达上限。

涉及变量

  1. 接口(key)

  2. 时间单位(expire)

  3. 允许访问多少次(limit)

  4. 访问次数(value)

条件一

当一个请求过来时,我们就会得到这个key。

if(存在key){

   value++;

   if(value>=limit){

   不能访问

   }

   }else{

   添加keyvalue1

       设置key过期时间为expire

   }


条件二

既然条件一已经实现了,那条件二会复杂么 ?

相比于条件一来说就是同一个key对应了多个用户。那么我们只需要把key加上用户的信息就可以了。比如说 key_用户1、key_用户2。

漏桶算法

核心思想

漏桶算法的意思呢就是一个接口在一个时间单位中允许被访问次数是动态变化的(假如一分钟允许访问60次,那么从开始计时时不管有没有被访问第59秒只允许访问59次,30秒只允许30次)。为什么这样呢,因为有另外一个线程在进行递减操作

涉及变量

  1. 接口(key)

  2. 时间单位(expire)

  3. 允许访问多少次(limit)

  4. 递减间隔时间(interval)

  5. 递减步长(step)

  6. 剩余可访问次数(value)

  7. key的访问时间(lastUpdateTime)

  8. 当前时间(nowTime)(注意nowTime的取值应为应用取得的时间而不是redis或者nginx取得的时间)

条件一

线程一:

if(存在key){

   value--

   if(value<=0){

   不能访问

   }

   }else{

   添加key,设置valuelimit

   }


线程二:

while(过去interval时间){

   所有keyvalue-step

   }


条件二

参考计数器算法条件二实现。

640?wx_fmt=jpeg

算法升级

可以看到实现漏桶算法的话需要每隔interval时间都要另外一条线程去遍历所key的value去做递减操作,那么有没有什么办法可以省略这一步呢。答案是肯定有。

if(存在key){

   value--

   if((nowTime-lastUpdateTime>interval{

   value=value-nowTime-lastUpdateTime/interval*step;

       lastUpdateTime=nowTime;

   }

   if(value<=0){

   不能访问

   }

   }else{

   添加key,设置valuelimit

       lastUpdateTime=nowTime

   }


令牌桶算法

核心思想

令牌桶算法呢,恰恰是和漏桶算法相反的一个算法,不过还是推荐你使用这个。这个算法的原理我不讲,我觉得聪明的你看了伪代码就明白了。

涉及变量

  1. 接口(key)

  2. 时间单位(expire)

  3. 允许访问多少次(limit)

  4. 递增间隔时间(interval)

  5. 递增步长(step)

  6. 当前可访问次数(value)

  7. key的访问时间(lastUpdateTime)

  8. 当前时间(nowTime)(参照漏桶算法需要注意的点)

条件一

线程一:

if(存在key){

   value++

   if(value>=limit){

   不能访问

   }

   }else{

   添加key,设置valuelimit

   }


线程二:

while(过去interval时间){

   所有keyvalue+step

   }


条件二

参考计算器算法条件二实现。

算法升级

参考漏桶算法升级实现。

代码

代码实现请参考我的限流框架https://github.com/2388386839/syj-ratelimit


扩展阅读

大型网站--负载均衡架构

从构建分布式秒杀系统聊聊限流特技

大型系统重构的步骤梳理


来源:http://zhixiang.org.cn/

文章来源网络,版权归作者本人所有,如侵犯到原作者权益,请与我们联系删除

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高级Java开发人员最常访问的几个网站

这是高级Java开发人员最常访问的几个网站。 这些网站提供新闻&#xff0c;一般问题或面试问题的答案&#xff0c;精彩的讲座等。质量是优秀网站的关键因素&#xff0c;这此网站都有较高的质量内容。下面逐一介绍&#xff1a;1. StackoverflowStackoverflow.com可能是编程世界中…

高级Java开发人员最常访问的几个网站

这是高级Java开发人员最常访问的几个网站。 这些网站提供新闻&#xff0c;一般问题或面试问题的答案&#xff0c;精彩的讲座等。质量是优秀网站的关键因素&#xff0c;这此网站都有较高的质量内容。下面逐一介绍&#xff1a;1. StackoverflowStackoverflow.com可能是编程世界中…

大型网站系统架构的演化

四、使用集群改善应用服务器性能应用服务器作为网站的入口&#xff0c;会承担大量的请求&#xff0c;我们往往通过应用服务器集群来分担请求数。应用服务器前面部署负载均衡服务器调度用户请求&#xff0c;根据分发策略将请求分发到多个应用服务器节点。常用的负载均衡技术硬件…

JavaWeb之ServletContext——统计用户访问网站次数

各位小伙伴大家好呀~今天我们来了解 ServletContext 对象ServletContext 对象1&#xff09;什么是 ServletContext 对象ServletContext 代表是一个 web 应用的环境&#xff08;上下文&#xff09;对象,ServletContext对象内部封装是该 web 应用的信息&#xff0c;一个 web 应用…

一个大型网站的技术架构是怎样建成的

网站系统架构层次如下图所示&#xff1a;1.前端架构前端指用户请求到达网站应用服务器之前经历的环节&#xff0c;通常不包含网站业务逻辑&#xff0c;不处理动态内容。浏览器优化技术并不是优化浏览器&#xff0c;而是通过优化响应页面&#xff0c;加快浏览器页面的加载和显示…

大型网站技术架构(二):架构要素和高性能架构

作者 | Arno原文 | https://segmentfault.com/a/1190000007390358在《大型网站技术架构&#xff08;一&#xff09;》我们把整个架构演变过程大致说了一下&#xff0c;这次我们来说说从哪方面进行考虑设计。为了使网站的能够应对高并发访问&#xff0c;海量数据处理&#xff0c…

网站高并发大流量访问的处理及解决方案

来自&#xff1a;Hist_花透的博客https://blog.csdn.net/qishouzhang/article/details/471119451.硬件升级普通的P4服务器一般最多能支持每天10万独立IP&#xff0c;如果访问量比这个还要大&#xff0c; 那么必须首先配置一台更高性能的专用服务器才能解决问题 &#xff0c;否则…

网站 HTTP 升级 HTTPS 完全配置手册

作者&#xff1a;葡萄城技术团队链接&#xff1a;https://my.oschina.net/powertoolsteam/blog/1862967今天&#xff0c;所有使用Google Chrome稳定版的用户迎来了v68正式版首个版本的发布&#xff0c;详细版本号为v68.0.3440.75&#xff0c;上一个正式版v67.0.3396.99发布于6月…

ubuntu怎么跳出系统自动进去_wordpress、Dedecms织梦等网站系统怎么做百度自动推送?...

主动向百度等搜索引擎可缩短爬虫发现网站链接时间&#xff0c;加快网站的收录速度。网站时效性内容建议使用链接提交工具&#xff0c;实时向搜索推送数据。那么wordpress、Dedecms织梦等网站系统怎么做百度自动推送呢&#xff1f;有开发能力的对于动开发的人来说&#xff0c;要…

利用 PHP 扩展 Taint 找出网站的潜在安全漏洞实践

一、背景笔者从接触计算机后就对网络安全一直比较感兴趣&#xff0c;在做PHP开发后对WEB安全一直比较关注&#xff0c;2016时无意中发现Taint这个扩展&#xff0c;体验之后发现确实好用&#xff1b;不过当时在查询相关资料时候发现关注此扩展的人数并不多&#xff1b;最近因为换…

网站mysql密码怎么修改_mysql怎么修改密码

第一种方式&#xff1a;最简单的方法就是借助第三方工具Navicat for MySQL或Navicat Premium来修改&#xff0c;方法如下&#xff1a;1、登录mysql到指定库&#xff0c;如&#xff1a;登录到student库。2、然后点击上方“用户”按钮。3、选择要更改的用户名&#xff0c;然后点击…

百度网站疑似宕机 众多网友反馈不能正常登陆

从11月9日上午11点10分开始&#xff0c;有不少网友开始网上抱怨&#xff0c;百度网站及其旗下App都打不开的消息&#xff0c;而从用户的反馈来看&#xff0c;范围还是挺大的。目前&#xff0c;不少网友在微博上反馈称&#xff0c;百度网站似乎出现了宕机&#xff0c;很多用户不…

8个程序员专用软件/网站,个个是神器,第一个最惊喜......

节省时间的方法有俩&#xff0c;一个是放弃做一些事&#xff0c;在做一些事的时候同步做另一些事。另一种就是改进做一些事的效率&#xff0c;更快地做一些事。寻找更加高效、好用的工具所花费的时间&#xff0c;和这些工具将为你节省的时间相比&#xff0c;九牛一毛。今天给大…

大型网站图片服务器架构的演进!

在主流的Web站点中&#xff0c;图片往往是不可或缺的页面元素&#xff0c;尤其在大型网站中&#xff0c;几乎都将面临“海量图片资源”的存储、访问等相关技术问题。在针对图片服务器的架构扩展中&#xff0c;也会历经很多曲折甚至是血泪教训&#xff0c;尤其是早期规划不足&am…

Kali 利用setoolkit制作钓鱼网站

实验环境&#xff1a;一台kali&#xff08;为机 NAT模式&#xff09; 一台物理机&#xff08;靶机&#xff09; 在kali的终端上打开setoolkit 选择第一个社会工程&#xff0c;选择社会工程之后接着有11个选项. 选择第二个网站向量,选择完之后有8个选项. 选择第三个凭证收割方…

使用nginx部署网站

前面的话如果服务器只需要放置一个网站程序&#xff0c;解析网站到服务器的网站&#xff0c;网站程序监听80端口就可以了。如果服务器有很多应用&#xff0c;借助nginx不仅可以实现端口的代理&#xff0c;还可以实现负载均衡。本文将详细介绍前端及nodeJS项目在服务器配置时需要…

程序员一般都浏览这些网站,不仅仅提升编程水平!

程序员作为一个经常和互联网打交道的人群&#xff0c;他们喜欢浏览那些网站呢&#xff1f;不爱敲代码的程序猿整理了以下网站供大家参考&#xff0c;排名不分先后&#xff1a;0. Googlehttps://google.com这个不用多说了吧。1.GitHub 开发者最最最重要的网站&#xff1a;https:…

广西网站服务器区域选择,广西地区云服务器选择

广西地区云服务器选择 内容精选换一换obsutil是适用于Windows、macOS和Linux操作系统的命令行工具&#xff0c;支持通过配置内网DNS服务器地址的方式&#xff0c;使在华为云上的Linux ECS通过内网直接访问OBS&#xff0c;下面将介绍其具体操作流程和操作步骤。登录华为云&#…

趣图:首次在 IE 中测试我的网站

扩展阅读趣图&#xff1a;当我看实习生编码趣图&#xff1a;听说客户还在用IE时趣图&#xff1a;代码写好了&#xff0c;咱们来测试吧

网站漏洞检测对漏洞检测修复方案

在网站安全的日常安全检测当中&#xff0c;我们SINE安全公司发现网站的逻辑漏洞占比也是很高的&#xff0c;前段时间某酒店网站被爆出存在高危的逻辑漏洞&#xff0c;该漏洞导致酒店的几亿客户的信息遭泄露&#xff0c;包括手机号&#xff0c;姓名&#xff0c;地址都被泄露&…