那天晚上,他真的好快!

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 那天晚上,他真的好快!

前言


今天啊,我的朋友小绿跟我说,那天晚上有个人好快好快!我急忙问他,怎么回事?有多快!他说,他的资源分发接口被人以很快的速度攻击了。速度达到了 10000qps,这对于他那 0.1C125M 的机器来说简直是小车拉大牛,真费车。


不忍心他承受那么快的速度,出于关心,我决定为他的接口加上限速。这样不但可以承受高压,还不影响正常服务用户,简直舒服。


关于 walrus



walrus 是一个 Redis 的操作库(对 redis-py 的二次封装),使用它可以简单实现数据缓存、全文搜索、频率限制等功能。今天我们就要使用 walrus 的频率限制功能来实现接口的频率限制。这对那些低频接口,一次性接口非常有用。


呆猫


安装 walrus


pip install walrus
复制代码


安装 Redis


官方地址:redis.io/

以下为 windows 版的 Redis 包下载地址


链接:pan.baidu.com/s/1ZRzMaS5e…

提取码:spf0


本文使用 windows 作为演示,Linux 同理。


下载完成后解压后
cd 到 redis 文件夹
在CMD中执行 redis-server.exe redis.windows.conf启动 redis 服务
然后重新打开一个CMD使用 redis-cli.exe -h 127.0.0.1 -p 6379 登录 reids 服务
复制代码


网络异常,图片无法展示
|


未做限速的后端代码


from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
import uvicorn
app = FastAPI()
@app.get('/')
def index():
    return {'status_code': True}
@app.get('/only2')
def api1(request: Request):
    return {'status_code': True, 'data': '不限速!'}
if __name__=='__main__':
    uvicorn.run(app='demo1:app',host='localhost',port=1213,reload=True)
复制代码


以上代码是不限速的,对于only2接口的访问可以无限,存在被并发攻击的风险。对于分发资源的接口来说非常不好。


网络异常,图片无法展示
|


限速后的后端代码


from walrus import Database, RateLimitException
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
import uvicorn
#db = Database(host='localhost',port=6379)
# 默认连接loalhost:6379,所以记得启动本地redis服务哦
db = Database()
rate = db.rate_limit('speedlimit', limit=2, per=60) # 每分钟只能调用2次
app = FastAPI()
@app.exception_handler(RateLimitException)
def parse_rate_litmit_exception(request: Request, exc: RateLimitException):
    msg = {'status_code': False, 'msg': f'别那么快,好不好?我已经记住了你的IP: {request.client.host}'}
    return JSONResponse(status_code=412, content=msg)
@app.get('/')
def index():
    return {'status_code': True}
@app.get('/only2')
@rate.rate_limited(lambda request: request.client.host)
def api2(request: Request):
    return {'status_code': True, 'data': '这个速度可以!'}
if __name__=='__main__':
    uvicorn.run(app='demo:app',host='localhost',port=1212,reload=True)
复制代码


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


如上,在限速内后端会正常向客户端分发资源。超过限速后后端直接向客户端返回 412 Precondition Failed 错误。通过 walrus 结合 redis 我们可以很简单的实现 api 速率限制。


本文只针对具体问题做简单的演示,生产环境中还请结合实际情况进行合理的选型和开发。希望我的分享能对你有所帮助。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
敏捷开发 canal otter
【周末瞎想】这个需求能不能不做?
【周末瞎想】这个需求能不能不做?
87 0
1332:【例2-1】周末舞会
1332:【例2-1】周末舞会
101 0
|
机器学习/深度学习 人工智能 程序员
上班要怎么摸鱼才不会被老板发现?
上班要怎么摸鱼才不会被老板发现?
433 0
上班要怎么摸鱼才不会被老板发现?
|
边缘计算 安全 网络协议
关于5G 的十点思考
面向工业互联网和智慧城市的高可靠、低时延等要求,5G以用户服务为本的理念代替了互联网的网络效率优先原则;为适应未来业务的不确定性,5G将从传统电信网的封闭性转为业务开放化和协议互联网化。5G试图兼具互联网与电信网的优势,但在实现上仍面临诸多挑战。文章提出了在网络建设与业务组织上需要重视的十个问题。
|
Java 程序员 应用服务中间件
月薪5千加班到凌晨,月薪5万5点下班,高级程序员到底强在哪里?
说起程序员人们的第一印象就是工资高、加班凶、话少钱多头发少。再加上现在科技互联网公司太吃香,bat、华为小米等公司程序员加班情况被广泛传播,程序员用生命在敲代码的印象刻在了很多人的心里。
1280 0
春节放假
春节休息,2018.2.13-2018.2.25号休息。
1030 0
你的周末是怎么过的?
周末的日子其实很短,有时候我都会有种错觉,每次醒来的第一反应是今天要上班吗?因为时间短,有限的时间总是有很多种过法,比如经典的一睡到底,我知道的朋友最厉害的能从早上睡到晚上。
1931 0

热门文章

最新文章