返回顶部
首页 > 资讯 > 前端开发 > JavaScript >web开发中分布式系统中的限流器实现算法怎么用
  • 215
分享到

web开发中分布式系统中的限流器实现算法怎么用

2024-04-02 19:04:59 215人浏览 安东尼
摘要

本篇文章给大家分享的是有关web开发中分布式系统中的限流器实现算法怎么用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一般限流器有五种算法,分

本篇文章给大家分享的是有关web开发分布式系统中的限流器实现算法怎么用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

一般限流器有五种算法,分别是:令牌桶,漏斗桶,固定窗口,滑动日志(指的其实是广义上的滑动窗口),滑动窗口(这里指的是滑动日志+固定窗口结合的一种算法)。

令牌桶(Token bucket)

令牌桶算法用来控制一段时间内发送到网络上的数据的数目,并允许突发数据的发送。

web开发中分布式系统中的限流器实现算法怎么用

算法大概是:  假设允许的请求速率为r次每秒,那么每过1/r秒就会向桶里面添加一个令牌。桶的最大大小是b。当一个大小为n的请求到来时,检查桶内令牌数是否足够,如果足够,令牌数减少n,请求通过。不够的话就会触发拒绝策略。

令牌桶有一个固定大小,假设每一个请求也有一个大小,当要检查请求是否符合定义的限制时,会检查桶,以确定它当时是否包含足够的令牌。如果有,那么会移除掉这些令牌,请求通过。否则,会采取其他操作,一般是拒绝。令牌桶中的令牌会以一定速率恢复,这个速率就是允许请求的速率(当然,根据大小的配置,可能实际会超过这个速率,但是随着令牌桶的消耗会被调整回这个恢复速率)。

如果令牌不被消耗,或者被消耗的速度小于产生的速度,令牌就会不断地增多,直到把桶填满。可以看出,令牌桶在保持整体上的请求速率的同时,允许某种程度的突发传输。

分布式环境下的令牌桶的实现需要考虑如下几个问题:

  • 令牌桶当前大小究竟如何存储?是只存储一个当前令牌桶的大小(例如通过 Redis 的一个键值对存储),还是存放每个通过的请求到来的时间戳(例如通过  redis 的 zset 实现,zset 的大小就是桶的最大大小)?

  • 令牌桶的令牌补充是由谁补充?对于存储一个当前令牌桶的大小的实现方式,需要一个进程以速率r不断地往里面添加令牌,那么如何在分布式的环境下保证有且只有一个这样的进程,这个进程挂了怎么办?对于存放每个通过的请求到来的时间戳的这种实现方式实现,那么怎么控制记录请求的个数,肯定不能每个都记录,并且每次怎么通过目前的请求以及时间戳来判断剩余令牌数量

漏斗桶(Leaky bucket)

漏斗桶控制请求必须在最大某个速率被消费,就像一个漏斗一样,入水量可大可小,但是最大速率只能到某一量值,不会像令牌桶一样,会有小的尖峰。

web开发中分布式系统中的限流器实现算法怎么用

算法大概是: 主要实现方式是通过一个 FIFO (First in first  out)的队列实现,这个队列是一个有界队列,大小为b,如果请求堆积满了队列,就会触发丢弃策略。假设允许的请求速率为r次每秒,那么这个队列中的请求,就会以这个速率进行消费。

分布式环境下的漏桶的实现需要考虑如下几个问题:

  • 漏桶的队列,怎么存放?这个队列需要存放每个通过的请求以及对应的消费的时间戳,保证消费的平稳。同时,这个队列最好是无队列,因为会有分布式锁征用。并且,这个队列大小应该设置为b,并每次有请求到来时,放入队列的同时清理队列。

  • 消费如何实现?也就是存入队列的请求,如何消费呢?可以请求到来时,通过队列中的请求来判断当前这个请求的执行时间应该是多久以后,之后入队列,延迟这么久再执行这个请求。也可以利用本身带延迟时间实现的队列来实现。

固定时间窗口(Fixed window)

固定时间窗口比较简单,就是将时间切分成若干个时间片,每个时间片内固定处理若干个请求。这种实现不是非常严谨,但是由于实现简单,适用于一些要求不严格的场景。  算法大概是: 假设n秒内最多处理b个请求,那么每隔n秒将计数器重置为b。请求到来时,如果计数器值足够,则扣除并请求通过,不够则触发拒绝策略。

web开发中分布式系统中的限流器实现算法怎么用

固定时间窗口是最容易实现的算法,但是也是有明显的缺陷:那就是在很多情况下,尤其是请求限流后拒绝策略为排队的情况下,请求都在时间窗口的开头被迅速消耗,剩下的时间不处理任何请求,这是不太可取的。并且,在一些极限情况下,实际上的流量速度可能达到限流的  2 倍。例如限制 1 秒内最多 100 个请求。假设 0.99 秒的时候 100 个请求到了,之后 1.01 秒的时候又有 100 个请求到了,这样的话其实在  0.99 秒 ~ 1.01 秒这一段时间内有 200 个请求,并不是严格意义上的每一秒都只处理 100  个请求。为了能实现严格意义上的请求限流,则有了后面两种算法。

滑动日志(Sliding Log)

滑动日志根据缓存之前接受请求对应的时间戳,与当前请求的时间戳进行计算,控制速率。这样可以严格限制请求速率。一般的网上提到的滑动窗口算法也指的是这里的滑动日志(Sliding  Log)算法,但是我们这里的滑动窗口是另一种优化的算法,待会会提到。

web开发中分布式系统中的限流器实现算法怎么用

算法大概是: 假设n秒内最多处理b个请求。那么会最多缓存 b  个通过的请求与对应的时间戳,假设这个缓存集合为B。每当有请求到来时,从B中删除掉n秒前的所有请求,查看集合是否满了,如果没满,则通过请求,并放入集合,如果满了就触发拒绝策略。

分布式环境下的滑动日志的实现需要考虑如下几个问题:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 我们的算法其实已经简化了存储,但是对于高并发的场景,要缓存的请求可能会很多(例如限制每秒十万的请求,那么这个缓存的大小是否就应该能存储十万个请求?),这个缓存应该如何实现?

  3. 并发场景下,对于这个集合的删除掉n秒前的所有请求的这个操作,需要速度非常快。如果你的缓存集合实现对于按照时间戳删除这个操作比较慢,可以缓存多一点请求,定时清理删除n秒前的所有请求而不是每次请求到来都删除。请求到来的时候,查看b个之前的请求是否存在并且时间差小于n秒,存在并且小于代表应该触发限流策略。

滑动窗口(滑动日志 + 固定窗口)

前面的滑动日志,我们提到了一个问题 -  要缓存的请求可能会很多。也许在我们的架构内不能使用一个恰当的缓存来实现,我们可以通过滑动窗口这个方法来减少要存储的请求数量,并减少集合大小减少同一个集合上面的并发。

web开发中分布式系统中的限流器实现算法怎么用

算法大概是:  假设n秒内最多处理b个请求。我们可以将n秒切分成每个大小为m毫秒得时间片,只有最新的时间片内缓存请求和时间戳,之前的时间片内只保留一个请求量的数字。这样可以大大优化存储,小幅度增加计算量。对于临界条件,就是之前已经有了n/m个时间片,计算n秒内请求量时可以计算当前时间片内经过时间的百分比,假设是  25%,那么就取开头的第一个时间片的请求量的 75% 进行计算。

web开发中分布式系统中的限流器实现算法怎么用

以上就是WEB开发中分布式系统中的限流器实现算法怎么用,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网JavaScript频道。

--结束END--

本文标题: web开发中分布式系统中的限流器实现算法怎么用

本文链接: https://lsjlt.com/news/81527.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • web开发中分布式系统中的限流器实现算法怎么用
    本篇文章给大家分享的是有关web开发中分布式系统中的限流器实现算法怎么用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一般限流器有五种算法,分...
    99+
    2024-04-02
  • Go语言开发实现分布式流式计算系统的方法与实践
    Go语言是一种自由、开源的编程语言,它以其高效的并发模型和简洁的代码风格而广受开发者的喜爱。在分布式计算领域,Go语言也展现出了其强大的开发能力和适用性。本文将介绍使用Go语言开发实现分布式流式计算系统的方法与实践。一、分布式流式计算系统概...
    99+
    2023-11-20
    分布式 方法和实践 流式计算
  • Go实现分布式系统高可用限流器实战
    目录前言1. 问题描述2. 信号量限流2.1 阻塞方式2.2 非阻塞方式3. 限流算法3.1 漏桶算法3.2 令牌桶算法3.3 漏桶算法的实现改进4. Uber 开源实现 RateL...
    99+
    2024-04-02
  • Java高并发系统限流算法的实现
    目录1 概述2 计数器限流2.1 概述2.2 实现2.3 结果分析2.4 优缺点2.5 应用3 漏桶算法3.1 概述3.2 实现3.3 结果分析3.4 优缺点4 令牌桶算法4.1 概...
    99+
    2024-04-02
  • 分布式系统中的 Python 算法实现方式有哪些?
    分布式系统是指由多个独立的计算机节点组成的系统,它们之间通过网络进行通信,共同完成一个任务。Python 是一种高级编程语言,它在分布式系统中的应用越来越广泛。本文将介绍分布式系统中的 Python 算法实现方式。 一、MapReduce ...
    99+
    2023-09-16
    编程算法 分布式 linux
  • 怎么在springcloud分布式系统中实现分布式锁
    本篇内容介绍了“怎么在springcloud分布式系统中实现分布式锁”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、简介一般来说,对数据进...
    99+
    2023-06-25
  • web开发中分布式系统的基础理论有哪些
    这篇文章给大家介绍web开发中分布式系统的基础理论有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、分布式系统与 Zookeeper 的关系1.1 集中式服务我们先从服务部署架构...
    99+
    2024-04-02
  • 分布式系统中怎么用python实现Paxos
    这篇文章主要介绍分布式系统中怎么用python实现Paxos,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一致性算法背景Paxos一致性算法解决的问题:分布式系统中数据不能存在单个节点(主机)上,否则可能出现单点故障...
    99+
    2023-06-15
  • ThinkPHP中怎么实现分布式应用系统
    这篇文章主要讲解了“ThinkPHP中怎么实现分布式应用系统”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ThinkPHP中怎么实现分布式应用系统”吧!一、什么是分布式应用系统分布式应用系统...
    99+
    2023-07-05
  • web分布式系统的负载均衡怎么实现
    本篇内容介绍了“web分布式系统的负载均衡怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、「负载均衡」是什么  &nbs...
    99+
    2023-06-02
  • web开发中的分布式事务是怎样的
    web开发中的分布式事务是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。事务(Transaction):一般是指要做的或...
    99+
    2024-04-02
  • 分布式系统中使用 Golang 函数实现分布式锁
    golang 函数可用于实现分布式锁,协调多个进程对共享资源的访问。这些函数通过利用共享存储(如 redis)来实现锁机制,确保在任何时刻只有一个进程能访问资源。 基于 Golang ...
    99+
    2024-04-20
    golang 分布式系统 redis git
  • 基于Redis实现分布式应用限流的方法
    限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务。前几天在DD的公众号,看了一篇关于使用 瓜娃 实现单应用限流的方案 --》原文,参考《redis in action》 实...
    99+
    2023-05-30
    redis 限流 流的
  • Java中怎么实现分布式计算
    Java中怎么实现分布式计算,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。远程过程调用的设计要创建出4种东西:服务器、客户端、服务器辅助设施和客户端辅助设施.创...
    99+
    2023-06-17
  • 怎么做高并发系统中的限流
    这篇文章主要介绍“怎么做高并发系统中的限流”,在日常操作中,相信很多人在怎么做高并发系统中的限流问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么做高并发系统中的限流”的疑惑...
    99+
    2024-04-02
  • go实现一个分布式限流器的方法步骤
    目录1. 接口定义2. LocalCounterLimiter3. LocalTokenBucketLimiter4. RedisCounterLimiter5. RedisToke...
    99+
    2024-04-02
  • PHP分布式异步编程:如何在Linux系统中实现分布式计算?
    PHP是一种流行的服务器端编程语言,广泛应用于Web开发。但是,PHP也可以用于分布式计算,通过将计算任务分配给多台计算机来加速计算。本文将介绍如何在Linux系统中使用PHP进行分布式异步编程。 一、什么是分布式计算? 分布式计算是一种...
    99+
    2023-11-07
    分布式 异步编程 linux
  • 使用 Go 语言开发高效的分布式计算系统
    珍惜时间,勤奋学习!今天给大家带来《使用 Go 语言开发高效的分布式计算系统》,正文内容主要涉及到等等,如果你正在学习Golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内...
    99+
    2024-04-04
  • SQL Server中怎么实现分布式数据库系统
    今天就跟大家聊聊有关SQL Server中怎么实现分布式数据库系统,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。   ...
    99+
    2024-04-02
  • 分布式开发医疗挂号系统数据字典模块web前后端怎么实现
    这篇文章主要介绍了分布式开发医疗挂号系统数据字典模块web前后端怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇分布式开发医疗挂号系统数据字典模块web前后端怎么实现文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作