典型服务架构介绍

典型的互联网服务访问链路都是分层结构的,从流量入口,到应用层,到后端资源层;其中流量入口可能会有4层负载均衡、7层负载均衡,负载均衡也可能有多层;流量打到应用层之后,就要看具体的业务场景了,不同的业务可能会有不同的依赖请求,包括对第三方服务的或者对缓存、数据库、队列等资源的访问。

┌──────────────────┐
│ LB - layer 4 │
└─────────┬────────┘


┌──────────────────┐
│ LB - layer 7 │
└──────────────────┘


......


┌──────────┐ ┌──────────┐
│ App │───────▶│Resources │
└──────────┘ └──────────┘

预案适用场景

此预案的应用场景并不是很多,在一般情况下我们不会启用这个预案。但是对Nginx入口(上图LB-layer 7处1)做限流的操作作为一项特殊场景下的预案还是有必要简单整理下的。
针对合适启动这个预案需要经过一系列的人工判断,并且具体是否要启用这个预案一般是需要经过业务方、运维、依赖方进行讨论确认的。
很多时候是否启动这个预案可能需要依赖一定的经验来判断,需要通过多项监控指标来综合考虑,没有某一个单一的监控指标可以指导启用这个方案。

下面简单描述几个适用此预案的场景:

  1. 疑似被刷量,需要配合业务QPS、访问日志中的来源IP、访问接口统计来甄别;
  2. 正常访问量增长,业务层代理、后端APP、后端资源等无法支撑,并且也没有可用的扩容资源、或者无法快速扩容;
  3. 基于极端场景下资源池资源不足,需要舍弃部分非核心业务来保障核心业务的时候,可能会对非核心业务做缩容,此时可能需要配合Nginx入口层的限流策略,避免因为后端缩容导致(非核心)业务完全不可用;
  4. 异常访问量,访问量大幅突增,后端无法支撑,并且无法快速定位、解决异常问题的时候;

监控指标

因为此预案的开启无法通过单一的监控指标来做判断,用于辅助判断是否启用此预案的监控指标列举如下:

  1. 域名QPS历史趋势
  2. 域名访问日志
  3. 容器LB、APP层机器(Pod)负载、后端资源负载

操作手册

相关文档

  1. http://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req
  2. https://www.centos.bz/2017/03/using-nginx-limit_req-limit-user-request-rate/

操作方法

启用限流需要两个步骤:

  1. 在http配置区段中声明一个limit_req_zone
  2. 在需要做限流的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指令进行修改

注意事项

  1. 配置的时候需要综合考虑请求的平均处理时间来配置请求并发数(burst)和频率(rates);
  2. 需要综合评估nodelay参数的影响,默认配置都是开启delay的,即所有超过限制频率的请求都会被延迟处理,在请求量高的情况下可能会超过Nginx backlog的限制;
  3. 我们一般会把这个限制做在LB层,LB层一般都会包含多台机器,在做限制的时候需要做好计算(总的rates限制需要乘以LB服务器的数量);
  4. limit_req_zone参数支持配置多个变量作为key,可以根据实际需求合理配置;

  1. 之所以将限流操作放到7层代理来做,是因为7层上可以更方便的基于业务来做配置,会更灵活。针对下文中描述的场景,这个预案是一个弃车保帅的方案,是为了避免特定的业务对整体业务造成影响,或者被迫放弃部分业务流量。 

代理层Nginx限流(降级)预案的更多相关文章

  1. Nginx可以说是标配组件,但是主要场景还是负载均衡、反向代理、代理缓存、限流等场景;而把Nginx作为一个Web容器使用的还不是那么广泛。

    Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛. 用Nginx+Lua(OpenResty)开发高性能Web ...

  2. Nginx限流办法

    Nginx 限流 电商平台营销时候,经常会碰到的大流量问题,除了做流量分流处理,可能还要做用户黑白名单.信誉分析,进而根据用户ip信誉权重做相应的流量拦截.限制流量.Nginx自身有的请求限制模块ng ...

  3. SpringBoot进阶教程(六十八)Sentinel实现限流降级

    前面两篇文章nginx限流配置和SpringBoot进阶教程(六十七)RateLimiter限流,我们介绍了如何使用nginx和RateLimiter限流,这篇文章介绍另外一种限流方式---Senti ...

  4. 死磕nginx系列--nginx 限流配置

    限流算法 令牌桶算法 算法思想是: 令牌以固定速率产生,并缓存到令牌桶中: 令牌桶放满时,多余的令牌被丢弃: 请求要消耗等比例的令牌才能被处理: 令牌不够时,请求被缓存. 漏桶算法 算法思想是: 水( ...

  5. 限流降级神器,带你解读阿里巴巴开源 Sentinel 实现原理

    Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度来帮助用户保护服务的稳定性. 大家可能会问:Se ...

  6. 图解Nginx限流配置

    本文以示例的形式,由浅入深讲解Nginx限流相关配置,是对简略的官方文档的积极补充. Nginx限流使用的是leaky bucket算法,如对算法感兴趣,可移步维基百科先行阅读.不过不了解此算法,不影 ...

  7. Nginx限流

    文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 在当今流量徒增的互联网时代,很多业务场景都会涉及到高并发.这个时候接口进行限流是非常有必要的,而限流是Ngin ...

  8. [转]Nginx限流配置

    原文:https://www.cnblogs.com/biglittleant/p/8979915.html 作者:biglittleant 1. 限流算法 1.1 令牌桶算法 算法思想是: 令牌以固 ...

  9. nginx限流模块(防范DDOS攻击)

    Nginx限流模式(防范DDOS攻击) nginx中俩个限流模块: 1.ngx_http_limit_req_module(按请求速率限流) 2.ngx_http_limit_conn_module( ...

随机推荐

  1. 步步向前之Element-UI

    Table 固定表头 只要在el-table元素中定义了height属性,即可实现固定表头的表格,而不需要额外的代码.例如: <el-table :data="tableData3&q ...

  2. #20175201 实现mypwd

    实验要求 学习pwd命令 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 实现mypwd 测试mypwd 了解pwd命令   pwd是"Print Working Di ...

  3. 搜索引擎算法研究专题五:TF-IDF详解

    搜索引擎算法研究专题五:TF-IDF详解 2017年12月19日 ⁄ 搜索技术 ⁄ 共 1396字 ⁄ 字号 小 中 大 ⁄ 评论关闭   TF-IDF(term frequency–inverse ...

  4. 数据结构和算法(Java版)快速学习(数组Array)

    Java数组 在Java中,数组是用来存放同一种数据类型的集合,注意只能存放同一种数据类型. 用类封装数组实现数据结构 数据结构必须具有以下基本功能: ①.如何插入一条新的数据项 ②.如何寻找某一特定 ...

  5. Python Module_pdb_DEBUG 方法

    目录 目录 pdb pdb 的 Debug 方式 pdb 的调试指令 示例 IPython 自带的 Debug 工具 ipdb pdb pdb 是 Python 自带的程序包,为 Python 程序提 ...

  6. C#学习基础

    c#的值类型存储在栈里,而引用类型的引用存储在栈里,数据存储在堆里. c#new关键字为对象分配一个引用而非存储数据. 引用类型关键字ref: For example: Int y; void mym ...

  7. 别把&和nohup混为一谈, 根本不是同一个东西好不好 ------ 聊聊./a.out & , nohut ./a.out , nohup ./a.out &的区别

    在第一家公司工作的时候, 我认识了&,在第二家公司工作的时候, 我认识了nohup,  这就是渊源.  随后, 我就一直糊涂用他们, 但并不懂这两个东西. 网上很多地方是乱扯, 瞎复制, 为什 ...

  8. ubuntu 虚拟机安装

    ubuntu16.04.5 LTS 安装   1.下载ubuntu镜像 打开ubuntu官网镜像地址https://launchpad.net/ubuntu/+cdmirrors 在上面中搜索chin ...

  9. 【监控笔记】【1.2】监控事件系列——SQL Trace(默认跟踪与自定义跟踪)

    目录: [1.1]概念与使用 [1.2]跟踪的基本操作 --[1.2.1]查看默认跟踪是否在运行 --[1.2.2]开启默认跟踪 --[1.2.3]关闭默认跟踪 --[1.2.4]查看跟踪文件/查看跟 ...

  10. P3951小凯的疑惑

    这是2017年提高组的第一题,是一个小学奥数题?听说很多大佬爆零了,我AC了,,, 这个题首先给出两个素数,问取任意个这两个素数之和不可以达到的最大的数是多少?拿到这个题首先很蒙,于是试了试样例,并没 ...