代理层Nginx限流(降级)预案
典型服务架构介绍
典型的互联网服务访问链路都是分层结构的,从流量入口,到应用层,到后端资源层;其中流量入口可能会有4层负载均衡、7层负载均衡,负载均衡也可能有多层;流量打到应用层之后,就要看具体的业务场景了,不同的业务可能会有不同的依赖请求,包括对第三方服务的或者对缓存、数据库、队列等资源的访问。
┌──────────────────┐
│ LB - layer 4 │
└─────────┬────────┘
│
▼
┌──────────────────┐
│ LB - layer 7 │
└──────────────────┘
│
│
......
│
▼
┌──────────┐ ┌──────────┐
│ App │───────▶│Resources │
└──────────┘ └──────────┘
预案适用场景
此预案的应用场景并不是很多,在一般情况下我们不会启用这个预案。但是对Nginx入口(上图LB-layer 7处1)做限流的操作作为一项特殊场景下的预案还是有必要简单整理下的。
针对合适启动这个预案需要经过一系列的人工判断,并且具体是否要启用这个预案一般是需要经过业务方、运维、依赖方进行讨论确认的。
很多时候是否启动这个预案可能需要依赖一定的经验来判断,需要通过多项监控指标来综合考虑,没有某一个单一的监控指标可以指导启用这个方案。
下面简单描述几个适用此预案的场景:
- 疑似被刷量,需要配合业务QPS、访问日志中的来源IP、访问接口统计来甄别;
- 正常访问量增长,业务层代理、后端APP、后端资源等无法支撑,并且也没有可用的扩容资源、或者无法快速扩容;
- 基于极端场景下资源池资源不足,需要舍弃部分非核心业务来保障核心业务的时候,可能会对非核心业务做缩容,此时可能需要配合Nginx入口层的限流策略,避免因为后端缩容导致(非核心)业务完全不可用;
- 异常访问量,访问量大幅突增,后端无法支撑,并且无法快速定位、解决异常问题的时候;
监控指标
因为此预案的开启无法通过单一的监控指标来做判断,用于辅助判断是否启用此预案的监控指标列举如下:
- 域名QPS历史趋势
- 域名访问日志
- 容器LB、APP层机器(Pod)负载、后端资源负载
操作手册
相关文档
- http://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req
- https://www.centos.bz/2017/03/using-nginx-limit_req-limit-user-request-rate/
操作方法
启用限流需要两个步骤:
- 在http配置区段中声明一个limit_req_zone
- 在需要做限流的http、server、location配置区段内部启用limit_req指令进行限速
配置语法
- limit_req_zone
Syntax:
limit_req_zone key zone=name:size rate=rate [sync];
Default:
—
Context:
http
- limit_req
Syntax:
limit_req zone=name [burst=number] [nodelay | delay=number];
Default:
—
Context:
http, server, location
配置样例
http {
limit_req_zone $upstream_addr zone=thatsit:100m rate=4000r/s;
server {
server_name thatsit.com;
location / {
limit_req zone=thatsit burst=300 nodelay;
}
}
}
配置解释
- limit_req_zone
limit_req_zone $upstream_addr zone=thatsit:100m rate=4000r/s;`
声明一个大小为100M名称为thatsit的limit_req_zone(会申请一块共享内存来键值的状态);
使用$upstream_addr变量来作为存储键值对用的键
限制到同一个upstream($upstream_addr)的平均请求频率为每秒4000 requests;
- limit_req
limit_req zone=thatsit burst=300 nodelay;
在
location /中启动请求限制,使用名为thatsit的共享内存空间来存储限流中用到的键值对
限制并发数300
请求超过限制之后不做延迟处理,直接响应错误,默认的错误状态码为503,这个状态码可以通过limit_req_status指令进行修改
注意事项
- 配置的时候需要综合考虑请求的平均处理时间来配置请求并发数(burst)和频率(rates);
- 需要综合评估
nodelay参数的影响,默认配置都是开启delay的,即所有超过限制频率的请求都会被延迟处理,在请求量高的情况下可能会超过Nginxbacklog的限制; - 我们一般会把这个限制做在LB层,LB层一般都会包含多台机器,在做限制的时候需要做好计算(总的rates限制需要乘以LB服务器的数量);
limit_req_zone参数支持配置多个变量作为key,可以根据实际需求合理配置;
之所以将限流操作放到7层代理来做,是因为7层上可以更方便的基于业务来做配置,会更灵活。针对下文中描述的场景,这个预案是一个弃车保帅的方案,是为了避免特定的业务对整体业务造成影响,或者被迫放弃部分业务流量。 ↩
代理层Nginx限流(降级)预案的更多相关文章
- Nginx可以说是标配组件,但是主要场景还是负载均衡、反向代理、代理缓存、限流等场景;而把Nginx作为一个Web容器使用的还不是那么广泛。
Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛. 用Nginx+Lua(OpenResty)开发高性能Web ...
- Nginx限流办法
Nginx 限流 电商平台营销时候,经常会碰到的大流量问题,除了做流量分流处理,可能还要做用户黑白名单.信誉分析,进而根据用户ip信誉权重做相应的流量拦截.限制流量.Nginx自身有的请求限制模块ng ...
- SpringBoot进阶教程(六十八)Sentinel实现限流降级
前面两篇文章nginx限流配置和SpringBoot进阶教程(六十七)RateLimiter限流,我们介绍了如何使用nginx和RateLimiter限流,这篇文章介绍另外一种限流方式---Senti ...
- 死磕nginx系列--nginx 限流配置
限流算法 令牌桶算法 算法思想是: 令牌以固定速率产生,并缓存到令牌桶中: 令牌桶放满时,多余的令牌被丢弃: 请求要消耗等比例的令牌才能被处理: 令牌不够时,请求被缓存. 漏桶算法 算法思想是: 水( ...
- 限流降级神器,带你解读阿里巴巴开源 Sentinel 实现原理
Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度来帮助用户保护服务的稳定性. 大家可能会问:Se ...
- 图解Nginx限流配置
本文以示例的形式,由浅入深讲解Nginx限流相关配置,是对简略的官方文档的积极补充. Nginx限流使用的是leaky bucket算法,如对算法感兴趣,可移步维基百科先行阅读.不过不了解此算法,不影 ...
- Nginx限流
文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 在当今流量徒增的互联网时代,很多业务场景都会涉及到高并发.这个时候接口进行限流是非常有必要的,而限流是Ngin ...
- [转]Nginx限流配置
原文:https://www.cnblogs.com/biglittleant/p/8979915.html 作者:biglittleant 1. 限流算法 1.1 令牌桶算法 算法思想是: 令牌以固 ...
- nginx限流模块(防范DDOS攻击)
Nginx限流模式(防范DDOS攻击) nginx中俩个限流模块: 1.ngx_http_limit_req_module(按请求速率限流) 2.ngx_http_limit_conn_module( ...
随机推荐
- springCloud分布式事务实战(一)案例需求及实现步骤
本文不对分布式事务原理进行探索,而是通过一个案例来说明如何使用分布式事务 案例需求:创建2个基于springCloud的微服务,分别访问不同的数据库:然后创建一个整合服务,调用微服务实现数据的保存到2 ...
- Spring Boot 访问到页面返回数据乱码
在@RequestMapping注解中增加produces="application/json;charset=UTF-8"即可 例如:@RequestMapping(value ...
- 第四周实验总结&实验报告
实验二 Java简单类与对象 实验目的 掌握类的定义,熟悉属性.构造函数.方法的作用,掌握用类作为类型声明变量和方法返回值: 理解类和对象的区别,掌握构造函数的使用,熟悉通过对象名引用实例的方法和属性 ...
- JSON.stringify方法报错:Converting circular structure to JSON
别以为JSON.parse(JSON.stringify(data))做深拷贝无敌,对于以下这种情况,当你需要保留父级对象,即 对象存在循环引用,就会报错. var a = [ { "id& ...
- 关于spotlight_on_oracle的配置及操作
Spotlight是一个强有力的Oracle数据库实时性能诊断工具,提供了一个直观的.可视化的数据库活动展现.Spotlight可视化展现性能瓶颈,一旦某个指标超出可接受的阀值的话.而且,通过下钻功能 ...
- Sensor在内核中的驱动框架【转】
本文转载自:http://blog.csdn.net/armfpga123/article/details/52840370 内核中对sensor的抽象:drivers/sensors/sensors ...
- fiddler之入门(安装配置)
在工作中常常需要进行数据的抓包和发包,此时就可以用到fiddler这个工具了. fiddler是一个http协议调试代理工具,通过http代理,让数据从其通过,来坚挺本地计算机与访问网络之间的所有ht ...
- Asp .Net Mvc在DeBug模式下设置自定义IP
首先打开所在项目下的.vs文件(查看隐藏文件) 打开config下的applicationhost.config文件 往下拖大概100多行的位置,复制一下binding,然后设置本地ip,如果是设置i ...
- .NET中使用EF6与连接MYSQL
ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,不仅支持SQL Server,还支持MySQL.Ora ...
- windows 使用Docker Desktop 使用国内镜像
===新增一些比较给力的镜像=== 1.中科大镜像加速地址 https://docker.mirrors.ustc.edu.cn 2.阿里云镜像服务 ========= 原本在配置项中添加了:国内镜像 ...