参考:

在 Apache APISIX 中,限流共提供了三种方式,下面说一下

  • limit-req 插件使用漏桶算法限制单个客户端对服务的请求速率
  • limit-conn 插件用于限制客户端对单个服务的并发请求数。当客户端对路由的并发请求数达到限制时,可以返回自定义的状态码和响应信息。
  • limit-count 件使用固定时间窗口算法,主要用于限制单个客户端在指定的时间范围内对服务的总请求数,并且会在 HTTP 响应头中返回剩余可以请求的个数。该插件原理与 GitHub API 的速率限制类似

请求的限制参数

key_type

  • ["var", "var_combination"]
  • var就是一个变更,不需要加$前缀
  • var_combination是一组变更的组合,如key为:$http_sub $http_x_forwarded_for

key

  • ["remote_addr", "server_addr", "http_x_real_ip", "http_x_forwarded_for", "consumer_name"]
  • 如果限流标识是在请求头里,如请求头是sub,那么key可以配置为http_sub

var和var_combination类型对应的配置

  • var_combination
"plugins": {
"limit-req": {
"burst": 10,
"key": "$consumer_name $remote_addr",
"key_type": "var_combination",
"rate": 2,
"rejected_code": 502
}
}
  • var
"plugins": {
"limit-req": {
"burst": 2,
"key": "remote_addr",
"key_type": "var",
"rate": 3,
"rejected_code": 502
},
"limit-count": {
"allow_degradation": false,
"count": 5,
"key": "http_sub",
"key_type": "var",
"policy": "local",
"rejected_code": 429,
"rejected_msg": "请求太多了",
"show_limit_quota_header": true,
"time_window": 60
}
}

配置redis

  • redis中key的组成plugin-limit-countroute540160115966214871:2389086815:347c9e9e-076c-45e3-be74-c482fffcc6e5

    • plugin-插件名route路由id::limit里的key值
  • 单节点
"plugins": {
"limit-count": {
"count": 2,
"time_window": 60,
"rejected_code": 503,
"key": "remote_addr",
"policy": "redis",
"redis_host": "127.0.0.1",
"redis_port": 6379,
"redis_password": "password",
"redis_database": 1,
"redis_timeout": 1001
}
}
  • 集群模式
"plugins": {
"limit-count": {
"count": 2,
"time_window": 60,
"rejected_code": 503,
"key": "remote_addr",
"policy": "redis-cluster",
"redis_cluster_nodes": [
"127.0.0.1:5000",
"127.0.0.1:5001"
]
}
}

插件的解释

  • limit-req
rate:
含义:每秒允许的请求数量。
示例:rate: 3 表示每个客户端(根据配置的 key)每秒最多可以发送 3 个请求。 burst:
含义:突发请求的最大数量。
示例:burst: 2 表示在短时间内,客户端可以突发额外的 2 个请求,即在正常速率为 3 的情况下,可以在某些时刻达到 5 个请求(3 + 2)。
  • limit-count
count:
含义:在指定的时间窗口内允许的最大请求次数。
示例:count: 2 表示每个客户端(根据配置的 key)在 time_window 指定的时间段内最多可以发送 2 个请求。 time_window:
含义:时间窗口的长度,以秒为单位。
示例:time_window: 60 表示时间窗口为 60 秒。在这 60 秒内,客户端最多可以发送 2 个请求。

对redis-key的解释

在 APISIX 中使用 limit-count 插件时,生成的 Redis 键通常包含多个部分,这些部分用来标识具体的限流策略和相关信息。你提到的键示例是:

plugin-limit-countroute540160115966214871:2389086815:347c9e9e-076c-45e3-be74-c482fffcc6e5

我们可以将这个键分解为几个部分以便理解:

键的组成部分

  1. plugin-limit-count

    • 这是固定的前缀,表示该键是由 limit-count 插件生成的。
  2. route540160115966214871

    • 这一部分通常表示与特定路由(route)相关的信息。
    • 540160115966214871 是路由的唯一标识符(ID),它对应于 APISIX 中配置的某个具体路由。这使得限流策略能够应用于特定的路由。
  3. 2389086815

    • 这一部分通常表示限流的维度或时间窗口的标识符,可能是一个时间戳或者是请求计数的某一部分。
    • 具体含义取决于你的限流配置,比如它可能是用于区分不同时间段内的请求计数。
  4. 347c9e9e-076c-45e3-be74-c482fffcc6e5

    • 这一部分一般是用户标识符(如客户端 ID 或者其他唯一标识符),用于在限流策略中区分不同的用户或客户端。
    • 这种设计允许对不同的用户或客户端分别进行限流控制。

总结

整个键的结构是为了确保每个限流实例都是唯一的,并且能够精确地与特定的路由和用户关联。通过这样的设计,APISIX 可以高效地管理和应用限流策略,以保障系统的稳定性和性能。

redis-count和redis-req的使用场景

漏桶算法(Leaky Bucket)和固定窗口限流(Fixed Window)是两种常见的限流策略,它们适用于不同的使用场景。以下是这两种限流策略的特点及其适用场景:

漏桶算法(Leaky Bucket)

特点:

  • 平滑输出:漏桶算法允许请求以固定速率被处理,尽管输入请求可以是不规则的。
  • 水位限制:桶内有一个容量限制,当达到上限时,多余的请求将被丢弃或拒绝。
  • 时间延迟:由于请求是以固定速率“漏出”的,因此可能会引入一定的延迟。

使用场景:

  1. 网络流量控制:适合需要平稳流量输出的场景,如视频流、音频流等。
  2. API调用限制:在需要防止突发流量对后端服务造成影响的情况下,可以使用漏桶算法来平衡请求量。
  3. 实时数据处理:适合处理实时数据流的场景,例如消息队列中的消息消费。
  4. 用户行为限制:例如限制用户在一定时间内的操作次数,以防止刷票、刷单等行为。

固定窗口限流(Fixed Window)

特点:

  • 时间窗口:将时间划分为固定长度的窗口,在每个窗口内允许一定数量的请求。
  • 突发性:在窗口开始时,所有请求都可以瞬间进入,但在窗口结束前不会再接受新的请求,直到下一个窗口开始。
  • 简单易实现:相对其他限流算法,固定窗口的实现较为简单。

使用场景:

  1. 日常访问控制:适合控制用户在特定时间段内的访问频率,比如限制用户每天的登录次数。
  2. API接口调用:用于限制外部系统对内部API的调用频率,确保系统稳定性。
  3. 短时间高并发场景:如电商促销活动期间,可以快速处理大量请求,但需要限制每个用户的请求频率。
  4. 统计分析:适合进行简单的统计计算,如记录某一时间窗口内的访问量。

总结

  • 漏桶算法更适合需要平滑流量控制的场景,能够有效防止突发流量造成的系统压力。
  • 固定窗口限流则适合短时间内的请求控制,简单易用,适合一些对时间窗口要求不严格的应用。

根据具体的业务需求和系统架构,可以选择合适的限流策略来保障系统的稳定性和可用性。

apisix~限流插件的使用的更多相关文章

  1. 基于令牌桶算法实现的SpringBoot分布式无锁限流插件

    本文档不会是最新的,最新的请看Github! 1.简介 基于令牌桶算法和漏桶算法实现的纳秒级分布式无锁限流插件,完美嵌入SpringBoot.SpringCloud应用,支持接口限流.方法限流.系统限 ...

  2. 深入Redis漏斗限流

    漏斗限流是最常用的限流方法之一,漏斗流水的速率大于灌水的速率,漏斗就永远装不满,反之水就会溢出. 所以漏斗的剩余空间就代表当前行为可以持续进行的数量,水流出的速率代表系统允许该行为的最大频率. imp ...

  3. BeetleX服务网关之限流和缓存

    限流和缓存相关是网关中两个非常重要的功能,前者是保障服务更可靠地运行,后者则可以大大提高应用的吞吐能力.Beetlex.Bumblebee微服务网关提供了两个扩展插件来实现这两个功能,分别是Beetl ...

  4. Spring Cloud Alibaba:Sentinel实现熔断与限流

    一.什么是Sentinel Sentinel,中文翻译为哨兵,是为微服务提供流量控制.熔断降级的功能,它和Hystrix提供的功能一样,可以有效的解决微服务调用产生的“雪崩效应”,为微服务系统提供了稳 ...

  5. RabbitMQ高级之消息限流与延时队列

    人生终将是场单人旅途,孤独之前是迷茫,孤独过后是成长. 楔子 本篇是消息队列RabbitMQ的第五弹. 上篇本来打算讲述RabbitMQ的一些高级用法: 如何保证消息的可靠性? 消息队列如何进行限流? ...

  6. 不死的小强 .net core 微服务 快速开发框架 Viper 限流

    1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...

  7. Redis解读(4):Redis中HyperLongLog、布隆过滤器、限流、Geo、及Scan等进阶应用

    Redis中的HyperLogLog 一般我们评估一个网站的访问量,有几个主要的参数: pv,Page View,网页的浏览量 uv,User View,访问的用户 一般来说,pv 或者 uv 的统计 ...

  8. AspNetCore添加API限流

    最近发现有客户在大量的请求我们的接口,出于性能考虑遂添加了请求频率限制. 由于我们接口请求的是.Net Core写的API网关,所以可以直接添加一个中间件,中间件中使用请求的地址当key,通过配置中心 ...

  9. Envoy实现.NET架构的网关(五)集成Redis实现限流

    什么是限流 限流即限制并发量,限制某一段时间只有指定数量的请求进入后台服务器,遇到流量高峰期或者流量突增时,把流量速率限制在系统所能接受的合理范围之内,不至于让系统被高流量击垮.而Envoy可以通过e ...

  10. springcloud3(六) 服务降级限流熔断组件Resilience4j

    代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-gateway/src/test/java/com/ ...

随机推荐

  1. C#自定义结构体的(用SendMessage)传递

    要传递结构体 public struct STUDENT { public int id; //ID public string name; //姓名 } 要引用Win32api函数FindWindo ...

  2. 从日志记一次Spring事务完整流程

    spring事务一次完整流程,创建 >确认获取连接 >完成 >提交>释放链接 DataSourceTransactionManager //Step1. 进入业务方法前,依据事 ...

  3. CEIT算法训练-双指针部分题解(全12题)

    代码宏定义以及框架约定 #include <bits/stdc++.h> using namespace std; #define IOS ios_base::sync_with_stdi ...

  4. c++11 动态内存与智能指针详解

    c++ 动态内存与智能指针详解 一. 动态内存 (一)程序对象的生存期 全局对象在程序启动时分配,在程序结束时销毁. 对于局部自动对象,当我们进入其定义所在的程序块时被创建,在离开块时销毁. 局部st ...

  5. C# Dynamic 转换成 Dictionary,Dynamic 转换成 DataTable

    部分软件开发的时候用到了 dynamic 类型,这个类型的数据不需要做其他处理的时候非常好用,但是需要对其中的数据调整的时候就不是那么好用了,这里提供两个常见的转换方式 Dynamic To Dict ...

  6. EF Core – ExecuteUpdate and ExecuteDelete (Bulk updates 批量更新和删除)

    前言 EF Core 在 SaveChanges 之后会一句一句的去更新和删除数据. 有时候这个效率是很差的. 而 SQL 本来就支持批量更新和删除, 所以是 EF Core 的缺失. 在 EF Co ...

  7. CSP提高组模拟1

    我的微軟輸入法莫名其妙變成繁體了,你們有什麽頭緒嗎 狀態 題目 20 Time Exceeded A 最短路 25 Time Exceeded B 方格取数 0 Time Exceeded C 数组 ...

  8. Kubernetes的Pod调度:让你的应用像乘坐头等舱!

    一.Kubernetes 中 Pod 调度的重要性 在 Kubernetes 的世界里,Pod 调度就像是一个繁忙的交通指挥官,负责把小车(也就是我们的 Pod)送到最合适的停车位(节点).调度不仅关 ...

  9. bpftool使用方法简介

    1.安装bpftool工具 看起来,在不同的linux发行版里,bpftool在不同的软件包里,ubuntu 22上,bpftool是linux-tools-generic的一部分,而树莓派里bpft ...

  10. 墨天轮最受DBA欢迎的数据库技术文档-容灾备份篇

    在大家的支持与认可下,墨天轮编辑部继续为大家整理出了[墨天轮最受欢迎的技术文档]系列第二篇--容灾备份篇,希望能够帮助到大家. 作为一名数据库管理员,最怕数据库中心突然失去服务能力.影响业务,而不论是 ...