0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

分布式限流简介

冬至子 来源:本木技术团队 作者:Zim 2023-05-16 16:40 次阅读

1 背景

限流是生产中经常遇到的一个场景, 目前现有的一个工具大部分是提供单机限流的能力, 例如 google 的 guava 中提供的 RateLimiter. 但是生产环境大部分是分布式环境, 在多台机器的环境下, 需要的是能对多台机器一起限流的分布式限流。 分布式限流依赖公共的后端存储, 所以还需要自己搭建。

2 算法

说到限流, 首先依赖的是限流的算法, 限流的算法很多包括令牌桶, 漏桶。

滑动窗口

滑动窗口算法的优点在于可以在滑动时间内计算出相对精确的限流数据。 想象一个简单的限流算法, 例如限制在一分钟内最多访问 10 次。 我们在后端存储的结构如下

pYYBAGRjQR6AD2p1AABFXyVVjms987.png

假设每个框代表了一分钟, 框中存储了一分钟内的限流数据, 那么问题在于我们想要红色框的限流的数据时将无法计算, 也就是说我们的限流的时间节点的起止时间是固定的。 而滑动窗口之所以为“滑动”, 则是为了解决这个问题诞生。 而实际上, 这个方法也是令牌桶的一种变相实现。

滑动实现的核心思想, 在于将时间块切分到更细的精度, 假如我们继续将 1 分钟切分为更小的维度, 例如 5 秒, 那么以后我们的频率计算的时间节点就可以变得更精确, 例如 10:11:00 ~ 10:12:00, 10:11:05 ~ 10:12:05, 10:11:10 ~ 10:12:10 。。。 做到 5 秒的精度, 如图

pYYBAGRjQS2AG2fOAABEpn05J9c911.png

从另一个角度来讲, 一分钟时间的间隔, 实际上也是一种滑动的特殊情况, 只不过精度一分钟。

3 后端存储

既然说到分布式实现, 则需要考虑公共的后端存储服务, 此处我们选择 redis, 因为 redis 提供了方便的数据结构供我们实现滑动窗口, 主要会用到 redis 中的 map. 具体实现可以参照代码。

实现

为了保证单次限流各种操作的原子性, 我们选择使用 lua 脚本执行限流逻辑, 最终会返回是否达到流量限制的结果。

pYYBAGRjQV2AEii2AAClTM_Q-TI084.pngpYYBAGRjQWWABkLpAADqJBF8uqw450.pngpoYBAGRjQWuADmBtAAEY3eAJq3M090.png

key : 限流记录的 key, 此处的 key 由外部传入, 一般根据我们需要限流的维度来生成。 例如如果是按 ip 对某个 url 做访问限流限制, 则 key 可能是 url:/test:ip:192.168.1.1

current time : 当前时间, 使用服务端 redis 时间, 为了保证分布式情况下时间的一致性, 这里的使用通过 redis.time 获取并传入 lua 脚本

duration : 限流的总时长, 例如 1 分钟则是 60 * 1000 ms

limitation : 最高流量限制, 例如每分钟 10 次, 则为 10

precision : 限流精度, 例如精度是 1s, 则为 1000 ms, 限流精度也是保证能实现上图红框内限流的关键, 精度越小, 限流越精确, block 数也越多, 占用的内存也越大。 实际上上图的简单限流即是 duration = precision 的一种特殊情况

permits : 本次需要增加多少流量, 对于频率来说一般是 1, 而对于流量来说则是数据流量的字节数

4 考虑的问题

redis 集群问题

由于 redis 是集群环境, 集群环境下实际上直接执行 lua 脚本是有问题的。 试想 lua 脚本内可能涉及到多个 key 的操作, 而 redis 实际执行节点的选择也是通过 key 来选择的。 在多 key 情况下可能会造成 lua 脚本内 key 的执行混乱, 所以我们需要先手动选择好 redis 节点。

此处我们可以先用限流的 key 将 redis 选择出来, 再将 lua 脚本传到某个 redis 节点执行。 也就是我们必须要可以通过限流 key 唯一确定一个 redis 节点, 例如 url:/test:ip:192.168.1.1 是可以确定使用某个 redis 节点的。

分布式时间问题

分布式系统需要考虑多客户端时间不一致问题, 此处使用 redis 时间解决。

客户端性能问题

由于这是一个公用的限流服务, 也就是所有接入该服务的应用的每次请求都会调用该服务, 再加上所有接入服务的应用共用一个 redis, 显然如果客户端使用同步等待限流服务的返回结果并不太合适, 会影响客户端的服务调用性能。

所以我们可以使用一种折中策略, 即将限流结果保存到本地, 每次请求直接检查本地限流结果是否被限流, 同时使用异步的方式调用限流服务, 并在异步回调中更新限流结果。 这种做法会让限流数据略有延迟, 但是影响不大。

限流服务本身的负载

作为限流服务, 一个主要的作用是限制恶意流量对正常业务造成冲击, 但如果所有流量都需要经过限流服务, 当流量激增的时候, 谁来保证限流服务自己不被压垮? 我的建议是设定一个阈值, 当流量超过某个阈值(一般来讲, 这个阈值可以设置为 机器数 * 限流阈值)时, 直接退化为本地限流。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • lua脚本
    +关注

    关注

    0

    文章

    21

    浏览量

    7530
  • Redis
    +关注

    关注

    0

    文章

    362

    浏览量

    10496
收藏 人收藏

    评论

    相关推荐

    Apache Kafka简介(2)#分布式数据

    分布式数据
    未来加油dz
    发布于 :2023年07月03日 22:45:56

    分布式软件系统

    分布式软件系统分布式软件系统(Distributed Software Systems)是支持分布式处理的软件系统,是在由通信网络互联的多处理机体系结构上执行任务的系统。它包括分布式
    发表于 07-22 14:53

    LED分布式恒流原理

    本帖最后由 eehome 于 2013-1-5 09:49 编辑 1. 分布式恒流技术分布式恒流就是:在各并联支路点均设立独立恒流源,从而管理、维持、控制支路与整体线路稳定。在使用上可视为一个
    发表于 03-09 16:47

    分布式发电技术与微型电网

    几种分布式发电简介2.分布式发电与配电网互联问题3.微型电网技术4.分布式发电(电源)技术应用的障碍和瓶颈5.分布式发电(电源)技术发展方向
    发表于 03-11 13:37

    分布式光纤测温系统DTS

    关于分布式光纤测温系统的简介说明
    发表于 10-18 14:01

    分布式声波传感系统DAS

    基本性能指标分布式光纤声波传感系统(DAS)性能指标7、DAS应用领域简介石油与页岩气压裂声波振动过程监测注:石油井下套管可能会泄露,同时井下有油水分层及其它地质结构变化,通过在油井顺着套管一起,因
    发表于 11-09 11:48

    如何设计分布式干扰系统?

    什么是分布式干扰系统?分布式干扰系统是一种综合化、一体化、小型化、网络化和智能化系统,是将众多体积小,重量轻,廉价的小功率侦察干扰机装置在易于投放的小型平台上,撒布在接近***扰目标空域地,通过指令
    发表于 08-08 06:57

    分布式系统的优势是什么?

    当讨论分布式系统时,我们面临许多以下这些形容词所描述的 同类型: 分布式的、删络的、并行的、并发的和分散的。分布式处理是一个相对较新的领域,所以还没有‘致的定义。与顺序计算相比、并行的、并发的和
    发表于 03-31 09:01

    HarmonyOS应用开发-分布式设计

    设计理念HarmonyOS 是面向未来全场景智慧生活方式的分布式操作系统。对消费者而言,HarmonyOS 将生活场景中的各类终端进行能力整合,形成“One Super Device”,以实现
    发表于 09-22 17:11

    分布式软总线子系统

    分布式软总线子系统简介目录约束使用涉及仓简介设备通信方式多种多样(USB/WIFI/BT等),不同通信方式使用差异很大且繁琐,同时通信链路的融合共享和冲突无法处理,通信安全问题也不好保证。本项
    发表于 04-23 17:12

    各种分布式电源的电气特性

    PS:渗透率的概念:从字面上理解,“渗透”就是由分布式电源发出的功率进入(渗入)到配电系统,所谓的“率”就是由分布式电源发出的电和整个系统所消耗的电(或者说总发电量)的一个比值。各种分布式电源的电气
    发表于 07-12 07:54

    如何高效完成HarmonyOS分布式应用测试?

    作者:liuxun,HarmonyOS测试架构师HarmonyOS是新一代的智能终端操作系统,给开发者提供了设备发现、设备连接、跨设备调用等丰富的分布式API。随着越来越多的开发者投入到
    发表于 12-13 18:07

    分布式电源分布式电源装置是指什么?有何特点

    分布式电源分布式电源装置是指与环境兼容的独立电源,功率为数千瓦与环境兼容。这些电源由电力部门、电力用户或第3方所有,用以满足电力系统和用户特定的要求。例如,对偏远地区的用户或商业地区、居民地
    发表于 12-29 06:51

    OpenHarmony3.1分布式技术资料合集

    1、OpenHarmony3.1的分布式硬件管理框架简介分布式硬件管理框架是为分布式硬件子系统提供信息管理能力的部件。分布式硬件管理框架为
    发表于 04-11 11:50

    常见的分布式供电技术有哪些?

      分布式供电技术是指将发电设备建设在用户或供电系统端,将发电与负荷直接相连,通过局部供电的方式满足用户的电力需求。其主要特点是将传统的集中式供电方式改为分散供电方式,不仅既有大型电站向小型分布式
    发表于 04-10 16:28