广告:Codex Token 低价中转站稳定接口 · 快速接入 · 开发者备用通道
Engineering article

新手必看:Serverless限流策略 | 10分钟学会

Serverless架构中的限流策略是高并发场景下的生存法则,我见过太多人因为没配置好而踩坑。别再幻想无状态服务能自动扛住流量,Serverless平台虽然帮你管理了底层资源,但你得自己控制入口。限流不是装个开关就完事,得考虑客户端、API网关、函数执行、负载均衡等多个层级的协同。我用过AWS API Gateway的Throttling

新手必看:Serverless限流策略 | 10分钟学会
配图来源于网络和AI生成,仅供参考。
▌ 技术引导
Serverless架构中的限流策略是高并发场景下的生存法则,我见过太多人因为没配置好而踩坑。别再幻想无状态服务能自动扛住流量,Serverless平台虽然帮你管理了底层资源,但你得自己控制入口。限流不是装个开关就完事,得考虑客户端、API网关、函数执行、负载均衡等多个层级的协同。我用过AWS API Gateway的Throttling和阿里云FC的QPS控制,也玩过Kong、Nginx Ingress、Envoy的限流模块,每种工具都踩过特定的坑。比如云函数默认不支持IP限流,需要配合CDN或者WAF;又比如限流策略一旦触发,可能会导致请求堆积,得用异步队列来缓冲。关键点是:你的限流策略必须和业务逻辑强耦合,不能一刀切。

▌ 技术参考


Serverless限流策略是应对突发流量、保护资源、优化成本的核心手段。在实际部署中,大部分平台都提供内置的限流能力,但默认配置往往不够灵活。例如,阿里云FC默认每秒处理能力是100请求,而AWS Lambda的Throttling机制默认限制在每秒500次。如果你的业务有高频访问需求,比如秒杀、抢购、API调用高峰,直接用平台默认会触发自动扩容,导致成本飙升。我见过一个电商项目,因为没配置限流,单日突增2000%的请求量直接把冷启动机制搞崩溃,函数执行超时率高达30%。所以必须在入口层和函数层都加限流。


限流的实现方式多种多样,且每种都有优缺点。在AWS API Gateway中,可以通过创建Usage Plans和API Keys来实现基于请求频率的限流,比如设置每用户每分钟最多500次调用。若是用Kong Gateway,可以通过Lua脚本实现基于IP、Header、Body、Path的限流,比如使用`kong.plugins.rate-limiting`插件,配置`second`和`maximum`参数。我之前在Kong上部署过,设置`second=10`和`maximum=200`,结果发现有些客户端用的是HTTP/2协议,导致请求被误判为同一个连接,从而触发限流。后来改用`per_client_rate_limiting`模式,才解决这个问题。


在阿里云FC中,限流主要通过Service的QPS配置和函数的并发设置来控制。比如在创建函数时,可以在`concurrency`字段设置最大并发数,防止资源被耗尽;又比如在API网关层,可以配置`Throttling`策略,设置每秒最大请求数。我曾经用过阿里云的API网关和FC结合,配置了`Throttling`的`quota`和`rate`参数,结果发现当流量达到阈值后,函数会进入排队状态,但排队时间控制在1秒内,用户感知不到延迟。不过如果流量过大,比如超过5000 QPS,函数会直接返回503错误,导致可用性下降。这种场景下,建议配合消息队列,比如用RabbitMQ或Kafka做缓冲。


在Nginx Ingress中,可以通过配置`limit_req`模块实现限流,这在Kubernetes环境中非常常见。比如在`ingress.yaml`中设置`limit-rate`和`limit-req`的参数。我之前用过`limit-req zone=mylimit burst=500 nodelay`,这能有效控制突发流量,但要注意参数的单位是每秒,而`burst`代表允许超过的请求数。设置不当会导致系统响应变慢,甚至拒绝服务。另外,`limit-req`的`zone`参数需要在Nginx的配置文件里显式定义,否则不会生效。其实还可以用`limit_conn`来控制连接数,不过这更适合Web服务器,而不是Serverless。


在实践中,限流策略必须结合业务场景来设计。比如,如果是短时高峰,像电商双11,可以用`burst`参数来应对,但若是持续高负载,建议用基于用户或IP的限流。我见过一个视频流平台,用AWS API Gateway的IP限流保护后端,每IP每分钟只能调用100次,这有效缓解了DDoS攻击,但同时也让一些合法用户被误判为攻击者,导致部分功能失效。所以,限流策略不能只看技术参数,还得结合日志分析来动态调整。另外,某些Serverless平台不支持IP限流,这时候需要引入CDN或者WAF来做前置过滤。


限流策略的实施需要考虑多层协同。比如在AWS中,API Gateway负责请求频率控制,Lambda负责业务处理,同时S3、DynamoDB这些资源也需要设置自己的限流。我之前部署了一个图像处理服务,结果DynamoDB的请求量超过默认限制,导致函数执行失败。后来在Lambda的代码里加了节流机制,比如用`aws-sdk.js`中的`maxRetries`和`timeout`参数,同时在DynamoDB的表配置里设定了`ReadCapacityUnits`和`WriteCapacityUnits`,这才让整体系统稳定下来。限流不是单一的,而是一个完整的保护链。


在Serverless架构中,限流策略的实现方式往往依赖于平台提供的工具。比如AWS的API Gateway支持细粒度的Throttling配置,可以按用户、API、路径等维度控制。阿里云FC的限流主要在网关和函数层,可以通过控制台或Terraform来配置。我之前用过Terraform来管理阿里云FC的限流策略,配置文件里写的是`concurrency = 100`,在API网关里写了`quota = 5000`,结果发现两者之间没有联动,导致某些接口在前端被限流,但后端依然被压垮。后来才明白,必须把限流策略设在最前端,比如用API Gateway的Throttling限制流量,再把FC的并发控制作为二次保护。


限流策略的配置必须考虑性能和成本的平衡。比如在Kong中,如果使用`rate-limiting`插件,每个请求都会增加内存压力,这在高并发下可能会触发OOM。我之前在Kong上用过`rate-limiting`插件,为了提升性能,用了`shared-database`模式,把限流数据存在Redis里,这样能减少内存占用,但会增加延迟。另外,Kong的限流插件支持`per_second`和`per_minute`两种模式,我曾遇到过一个场景,用户刷接口时请求量极高,导致函数执行超时,后来改用`per_second`的模式,配合`burst`参数,才让系统扛住了压力。


Serverless平台的限流策略大多基于令牌桶或漏桶算法,但具体行为因平台而异。比如在AWS API Gateway中,Throttling默认使用令牌桶,但限制的是请求量而非线程数,这意味着即使请求被限流,后端资源也不会被触发。而阿里云FC的限流是基于并发数的,它会控制每个请求同时执行的数量,但不会直接丢弃请求,而是等待队列。我曾经在两个平台同时部署了相同的限流策略,结果AWS的系统更稳定,而阿里云的执行时间波动更大。这说明,限流策略的设定要因地制宜,不能生搬硬套。


限流策略的配置需要结合实际流量测试。我之前用过一个工具叫`wrk`,用来模拟高并发请求,测试不同限流配置下的系统表现。比如在阿里云FC中,用`wrk`压测时发现,当QPS达到5000时,函数开始排队,但队列长度在100以内,延迟控制在200ms以内;而当QPS超过8000时,队列长度开始爆炸,延迟超过4s,这时候就必须用Kafka或RabbitMQ作为缓冲。在AWS上,用`api-gateway`的测试工具,可以实时查看Throttling的触发情况,但参数调整后需要等待20分钟才能生效,这对调试来说是个麻烦。

十一
限流策略的实施还要考虑客户端的应对方式。我见过很多开发者完全依赖平台的限流,但忽略了客户端自身的节流。例如,在AWS API Gateway中,如果后端函数被限流,客户端会收到503错误,但如果你在客户端加了重试机制,可能会加重后端负担。后来我改用`HTTP 429 Too Many Requests`码来控制重试次数,同时在函数内部加上日志分析,判断是否是限流触发导致的失败。这种做法能减少后端压力,同时让客户端更优雅地处理异常。

十二
在Serverless中,限流策略的参数调整需要精细化。比如在阿里云FC中,设置`concurrency`为200,意味着最多同时处理200个请求,但如果某个接口的QPS很高,可能需要在网关层再加一层限制。我之前在实际项目中用过`concurrency=500`,但某个接口的TPS达到了1200,结果后端资源被耗尽,导致函数无法加载。后来把网关层的QPS设为800,函数层的并发设为400,这才缓解了这个问题。参数调整不是一次性的,而是要不断测试和优化,这需要一套完整的监控系统。

十三
限流策略的监控是关键。我曾经用过Prometheus+Grafana来监控Serverless服务的QPS、并发数、延迟等指标。比如在AWS中,通过CloudWatch可以查看API Gateway的ThrottledRequests和Latency,而在阿里云FC中,则需要依赖阿里云的日志服务SLS。如果没监控,你永远不知道限流是否生效,或者是否过度配置。有一次我误把FC的并发设成了1000,结果服务器资源瞬间被耗尽,系统崩溃,直到监控报警才发现。所以,监控系统必须和限流策略同步,这样才能及时发现异常。

十四
限流策略的替代方案包括使用消息队列和异步处理。比如在Kafka或RabbitMQ中,可以设置生产者的`max.poll.records`和消费者的`max.poll.interval.ms`,这在Serverless环境中特别有用。我之前用过RabbitMQ来缓冲高并发请求,将HTTP请求转换成消息,再由FC异步处理,这样既避免了限流,又控制了资源使用。不过这种方法会增加系统复杂度,同时还要处理消息堆积和重试的问题。如果流量不稳定,消息队列反而会成为瓶颈。

十五
Serverless限流策略的落地需要工具链的配合。比如在AWS中,可以用`aws-cli`来创建Usage Plans和API Keys,并通过`aws apigateway get-usage-plan-usage`来查看限流效果。而在阿里云中,可以通过`aliyun fc`命令行工具设置函数的并发参数,比如`aliyun fc update-function --function-name my-function --concurrency 500`。我曾经用过Terraform来管理这些配置,但发现写出来的模板很难覆盖所有限流场景,只能作为辅助手段。真正稳定的部署还得靠手动测试和日志分析。

十六
在某些情况下,限流策略可以成为业务设计的一部分。比如,我见过一个支付系统,为了防止恶意用户刷单,用HTTP头`X-Request-ID`来识别用户,并在API网关层设置每用户每分钟最多100次请求。这种做法虽然能有效控制流量,但需要配合客户端生成请求ID,并且在后端分布式存储中记录这个ID,这增加了系统复杂度。另外,这种策略容易被绕过,所以得配合WAF和IP限流一起使用,才能真正起到防护作用。

十七
在Serverless环境中,限流策略的性能影响非常明显。例如,在Kong中,如果使用`rate-limiting`插件,每次请求都要做鉴权和限流判断,这会增加约15%的延迟。而在阿里云FC中,限流主要是通过资源争抢来实现,当并发超过设定值时,函数会被阻塞,延迟增加300ms以上。我在一个高并发项目中,使用了AWS API Gateway的限流和函数层的并发限制,结果发现,当请求量超过8000时,API网关开始返回429错误,而FC的执行延迟开始飙升,这时候需要引入异步处理和消息队列,把压力分散到多个节点。

十八
限流策略的配置需要考虑平台的特性。比如,AWS API Gateway的限流是基于请求频率,而阿里云FC的限流是基于函数实例的并发数。我之前在AWS上设置过`Throttling`的`burst`参数为500,结果发现某些突发请求会被暂时接受,但随后立即触发限流。后来发现,AWS的Throttling默认是基于令牌桶算法,允许一定量的突发请求,但当请求量持续超过时,会逐渐限制到设定的`rate`。而阿里云FC的限流更像漏桶算法,一旦超过并发数,请求就会被排队处理,这在某些场景下反而更稳定。

十九
Serverless限流策略的配置必须和业务逻辑强绑定。比如,我在一个数据分析项目中,将限流策略放在API网关层,根据不同的数据集设置不同的QPS限制。这样既能防止某个数据集被恶意刷,又能保证其他数据集的可用性。另外,限流策略需要和认证系统结合,比如用`X-Auth-Token`来识别用户,这样能更精确地控制每个用户的流量。在阿里云中,可以通过`api-gateway`的`UsagePlan`来设置每个用户的限流,这比简单的IP限流更有效。

二十
在实际场景中,我见过很多系统因为限流策略配置错误而崩溃。比如,有人在阿里云FC中把`concurrency`设置成了1000,却没在API网关层设置QPS限制,导致请求直接压垮后端。还有的系统在Kong中设置`burst=100`,但没设置`second=5`,结果导致突发请求被全部接受,后续请求被大量丢弃。限流策略的参数设置必须经过实地测试,不能靠猜测。最好用`wrk`或`ab`来压测,观察不同参数下的系统表现,再结合日志分析调整策略。