nginx+lua实现限流降级(使用lua的lua-resty-limit-traffic)
前言
虽然nginx中自带了限流的模块,只能直接限定超出的数量,但对于允许范围内的流量如何进行限流是个问题。nginx的限流方式!
limit_conn perserver 100;limit_conn perip 15;limit_rate 512k;
但是比如这100的允许的值,0-30个请求去mysql读数据,31-70去redis读数据,71-100去文件直接读数据,nginx不好做这个事情,所以引入lua的lua-resty-limit-traffic来设计。
local limit_req = require "resty.limit.req"
-- 这里设置rate=50个请求/每秒,漏桶桶容量设置为1000个请求
-- 因为模块中控制粒度为毫秒级别,所以可以做到毫秒级别的平滑处理
-- my_limit_req_store是共享内存,请在http中设置一下 lua_shared_dict my_limit_req_store 100m;
local lim, err = limit_req.new("my_limit_req_store", 50, 1000)
if not lim thenngx.log(ngx.ERR, "failed to instantiate a resty.limit.req object: ", err)return ngx.exit(501)
endlocal key = ngx.var.binary_remote_addr
local delay, err = lim:incoming(key, true)ngx.say("计算出来的延迟时间是:")
ngx.say(delay)--if ( delay <0 or delay==nil ) then--return ngx.exit(502)
--end-- 1000以外的就溢出
if not delay thenif err == "rejected" thenreturn ngx.say("1000以外的就溢出")-- return ngx.exit(502)endngx.log(ngx.ERR, "failed to limit req: ", err)return ngx.exit(502)
end-- 50-100的等待从微服务+mysql获取实时数据;(100-50)/50 =1
if ( delay >0 and delay <=1 ) thenngx.say("第50-第100个 等待0-1秒后 从mysql获取数据")ngx.sleep(delay)-- 100-400的直接从redis获取实时性略差的数据;(400-50)/50 =7
elseif ( delay >1 and delay <=7 ) thenlocal resp, err = redis_instance:get("redis_goods_list_advert")ngx.say("第100-第400个 降级为从redis获取数据")ngx.say(resp)return-- 400-1000的从静态文件获取实时性非常低的数据(1000-50)/50 =19
elseif ( delay >7) thenngx.say("第400-第1000个 降级为从静态文件(死页面)获取数据")ngx.header.content_type="application/x-javascript;charset=utf-8"local file = "/etc/nginx/html/goods_list_advert.json"local f = io.open(file, "rb")local content = f:read("*all")f:close()ngx.print(content)return
endngx.say("进入查询微服务+mysql(最实时的数据,进入这里就是没降级)")
nginx+lua实现限流降级(使用lua的lua-resty-limit-traffic)相关推荐
- 限流降级神器-哨兵(sentinel)原理分析
Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度来帮助用户保护服务的稳定性. 大家可能会问:Se ...
- sentinel 阿里 原理_限流降级神器:哨兵(sentinel)原理分析
文章较长,但是干货满满,建议收藏或关注后细读 Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度来 ...
- nginx根据ip限流和突发流量配置解释
前言 前一篇记录了如何使用Nginx代理Vue项目,今天记录如果使用Nginx配置location限流,本篇是Nginx专栏第5篇, 有想学习nginx的可以订阅下该专栏,大家一起讨论,有问题可以留言 ...
- 高可用架构之限流降级
一.服务等级协议 我们常说的N个9,就是对SLA的一个描述. SLA全称是ServiceLevel Agreement,翻译为服务水平协议,也称服务等级协议,它表明了公有云提供服务的等级以及质量. 例 ...
- 带哨兵节点的链_限流降级神器-哨兵(sentinel)的资源调用链原理分析
点击上方 Yoon丶徒手摘星 ,选择 置顶或者星标技术干货每日送达! 我们已经知道了sentinel实现限流降级的原理,其核心就是一堆Slot组成的调用链. 这里大概的介绍下每种Slot的功能职责:N ...
- 36、熔断-限流-降级
目录 一.服务雪崩 二.熔断-限流-降级概述 三.熔断限流技术选型 四.sentinel限流 1 - 基于QPS限流 2 - Throttling策略 3 - sentinel预热/冷启动 五.sen ...
- ratelimit+redis+lua对接口限流
背景:为防止接口QPS太大而造成系统运行卡顿的现象,在这儿以ratelimit+redis+lua对系统接口做了个限流.当时也考虑过使用其他的限流方法,比如微服务生态中使用的sentinel中间件,但 ...
- 阿里巴巴开源限流降级神器Sentinel大规模生产级应用实践
作者:丁浪,目前在创业公司担任高级技术架构师.曾就职于阿里巴巴大文娱和蚂蚁金服.具有丰富的稳定性保障,全链路性能优化的经验.架构师社区特邀嘉宾! 前言 互联网上关于限流算法.Sentinel功能介绍. ...
- 阿里巴巴宣布开源限流降级中间件——Sentinel
近日,阿里巴巴中间件团队宣布开源 Sentinel,并发布了首个社区版本v0.1.0.GitHub地址为:https://github.com/alibaba/Sentinel . 关于Sentine ...
最新文章
- Matlab编程与数据类型 -- 出错处理语句try/catch/end
- python-windows环境安装
- [TCP/IP] SSL的通讯原理
- 全向轮机器人特性分析
- 如何破解物联网卡带来的连接痛点
- 四叶草efi_Clover EFI bootloader for Mac(四叶草启动引导工具)
- python实训报告怎么写_python实验报告
- arch模型 matlab,ARCH模型(arch模型干嘛的)
- 手把手教你使用wordpress搭建个人网站
- 【过关斩将】如何在工作中提高沟通能力?
- 500万像素视频会议摄像机 高清视频会议摄像机
- STW43NM60ND-ASEMI原厂代理意法MOS管STW43NM60ND
- 麦肯锡|稻盛和夫|麦肯锡方法与稻盛经营哲学
- R绘图基础指南 | 2.折线图
- 读李嘉诚财智人生,历练人生精华
- 25.(C语言)回文数判断万用公式
- meate30pro刷鸿蒙,华为Mate40E和mate30pro哪个好-参数对比测评
- 九 Python 类与对象详解,这是软件工程师的分水岭
- 列举几个常用的linux命令以及说明?
- 生成GitHub项目目录的树形结构图
热门文章
- Tomcat系列之服务器的基本配置及Nginx反向代理tomcat服务
- 人脸服务器如何与门禁系统对接,安全升级!人脸识别门禁终端集门禁考勤访客对讲一步到位...
- listen的backlog值分析
- Matlab相机标定可能遇到的报错
- 使用excel万金油公式的注意事项
- LeetCode刷题笔记 - 175.Combine Two Tables
- 2022年数维杯国际赛C题 如何利用大脑结构诊断阿尔茨海默氏病
- android中实现更溜的字母导航索引
- 基于MATLAB车牌图像识别的设计与实现
- 流量如何才能变现?实际测试谷歌广告联盟(Google Adsense)的广告效果以及如何优化相关代码