热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

作用_服务限流的作用及实现

本文由编程笔记#小编为大家整理,主要介绍了服务限流的作用及实现相关的知识,希望对你有一定的参考价值。限流的主要目的是通过限制并发访问数或者
本文由编程笔记#小编为大家整理,主要介绍了服务限流的作用及实现相关的知识,希望对你有一定的参考价值。


限流的主要目的是通过限制并发访问数或者限制一个时间窗口内允许处理的请求数量来保护系统,一旦达到限制数量则对当前请求进行处理采取对应的拒绝措施,比如跳转到错误页面、拒绝请求、进入排队系统、降级等。从本质上来说,限流的主要作用是损失一部分用户的可用性,为大部分用户提供稳定可靠的服务,比如系统当前能够处理的并发数是10万,如果此时来了12万用户,那么限流机制会保证为10万用户提供正常服务。




在实际开发中,限流几乎无处不在。






  • nginx层添加限流模块限制平均访问速度。



  • 通过设置数据库连接处、线程池的大小来限制总的并发数。



  • 通过Guava提供的Ratelimiter限制接口的访问速度。



  • TCP通信协议中的流量整形。





要实现限流,最重要的就是限流的算法。





计数器算法






计算器算法是一种比较简单的限流实现算法,在指定周期内累加访问次数,当访问次数达到设定的阈值时,触发限流策略,当进入下一个时间周期时将访问次数清零,重新计数。


如上图,限定了每一分钟能够处理的总的请求数为100,在第一个一分钟内,一共请求了60次,接着到第二个一分钟,counter又从0开始计数,如果在一分半钟的时候,已经达到最大限流的阈值,这个时候后续的所有请求都会被拒绝。这种算法可以用在短信发送的频次限制上,比如限制同一个用户一分钟内触发短信的次数。

服务限流的作用及实现



这种算法存在一个临界问题,如上图,在第一分钟的0:50s和第二分钟的1:10s这2个时间段分别出现了100个请求,整体上来看就会出现20s内的请求量达到200个,超出了设置的阈值。






滑动窗口算法




为了解决计数器算法带来的临界问题,所以引入了滑动窗口算法。滑动窗口算法是一种流量控制技术,在TCP网络协议中,就采用了滑动窗口算法来解决网络拥塞的情况。


滑动窗口算法的原理是在固定窗口中分割出多个小时间的窗口,分别在每个小时间窗口中记录访问次数,然后根据时间将窗口往前滑动并删除过期的小时间窗口,最终只需要统计滑动窗口范围内的所有小时间窗口总的计数即可。

服务限流的作用及实现

如上图,我们将一分钟拆分成4个小时间窗口,每个小时间窗口最多能够处理25个请求,并且通过虚线框表示滑动窗口的大小。同时滑动窗口会随着时间往前移动,比如前面15S结束之后,窗口会滑动到15s ~ 45s这个范围,然后在新的窗口中重新统计数据,这种方式很好的解决了固定窗口算法的临界值问题。Sentinel就是采用滑动窗口算法来实现限流的。





令牌通限流算法




令牌桶是网络流量整形和速率限制中最常用的一种算法,对于每一个请求,都需要从令牌桶中获取一个令牌,如果没有获得令牌,则需要触发限流策略。

如上图,系统会以一个恒定的速率往固定容量的令牌桶中放入令牌,如果此时有客户端请求过来,则需要先从令牌桶中得到令牌以获得访问资格。


由于令牌桶有固定的大小,当请求小于令牌桶生成速度时,令牌桶会被填满,所以令牌桶能够处理突发流量,也就是在短时间内新增的流量系统能够正常处理,这是令牌桶的特性。





漏桶限流算法




漏桶限流算法的主要作用是控制数据注入网络的速度,平滑网络上的突发流量。



在漏桶算法内部同样维护一个容器,这个容器会以恒定速度出水,不管上面的水流速度多快,漏桶水滴的流出速度始终保持不变。实际上消息中间件就使用了漏桶限流的思想,不管生产者的量有多大,消息的处理能力取决于消费者。






漏桶限流算法和令牌桶限流算法的实现原理相差不大,最大的区别是漏桶无法处理短时间内的突发流量,漏桶限流算法是一种恒定速度的限流算法。

推荐阅读
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文详细探讨了Netty中Future及其子类的设计与实现,包括其在并发编程中的作用和具体应用场景。我们将介绍Future的继承体系、关键方法的实现细节,并讨论如何通过监听器和回调机制来处理异步任务的结果。 ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 本文探讨了在 ASP.NET MVC 5 中实现松耦合组件的方法。通过分离关注点,应用程序的各个组件可以更加独立且易于维护和测试。文中详细介绍了依赖项注入(DI)及其在实现松耦合中的作用。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
author-avatar
longfeiPHP
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有