共计 2130 个字符,预计需要花费 6 分钟才能阅读完成。
作为一名深陷在增删改查泥潭中练习时长三年的夹娃练习生,偶然会因为没有开发工作不晓得周报写什么而苦恼。
正愁这周写啥呢,组长过去交代了个跟进第三方公司性能测试报告的工作,我一寻思这活不最好干了吗,正愁不晓得周报咋写呢,又能提现工作量又不累,本认为轻松拿捏的后果差点让老弟翻车。
因为咱们组次要做数仓治理这块的业务,这次的性能测试上有一些数据服务并发相干的指标须要后端配合测试,让一天搞定,我寻思半天搞完还能去掘金狠狠的摸半天鱼,岂不美哉。拿到测试指标之后间接手心出汗了。
啥意思,亿级数据查问毫秒级响应还要 100 并发继续 5 分钟,家人们谁懂啊。。。要害咱们负责的业务是 tob 的场景啊,哪有这么高并发。数据查问还在旧的 python 服务里,给提供的测试环境全是单机服务。
加缓存
既然是做性能测试那管数据对不对什么事,给你返回不就行了,在服务加个长期缓存,先把数据查问的耗时降下来再思考其余的。
身为一个 Javaboy,写 python 的代码 10 行代码得 5 行问 chatGPT,好在是用 redis 加上了缓存。用 jmeter 浅试一下,
成果上看加上缓存查问速度确实变快了,然而均匀耗时离预期还是差距较大,最大耗时要靠近 5s 多,看来只加缓存是扛不住,耗时应该是服务扛不住并发,线程阻塞了。。。
nginx 横向扩大
不得不吐槽下,服务真垃圾呐,工夫紧工作重,连忙想方法,间接把问题当成面试题,脑袋里间接开始翻阅八股文,什么高内聚、低耦合、高吞吐、月薪 3000 包吃住,第一个冲进去的想法就是扩大服务做负载。
怎么负载呢,部署三份数据查问服务,nginx 做 upstream 负载,成果应该顶得住,开搞开搞。后果 python 代码不太熟,多过程的形式启动 torando 就是报错。整的我满头大汗,下午就得给人提供接口了这咋整啊,不行问问组长去吧。
后果组长间接说节约那工夫干啥啊,反正都是做做样子,在 nginx 里写个 lua 脚本,读一下本地文件返回数据不就能够了,第三方又不会管你咋实现的 … 都得都懂。
lua 脚本
我认真一想也是,整那么缓和干啥,先实现了再说,因为环境里的 nginx 曾经装置了 lua 插件能够间接应用。
先提前把申请的返回数据保留到 txt 里,而后用 lua 实现一个读取本地文件的办法,申请打过去之后判断 body 里的数据是否是指定的数据 id,如果是间接读取数据返回。
nginx 和 lua 的性能别说 100 并发了 1w 并发也轻松拿捏。
lua 读取本地文件内容
lua 复制代码 function getFile(file_name)
local f = assert(io.open(file_name, 'r'))
local string = f:read("*all")
f:close()
return string
end
找到 nginx 配置对应的申请 url,增加 access_by_lua_block 代码块,将 getFile 办法申明在这里,并且写一下匹配逻辑,如果 body 中蕴含 file_id,间接调用 getFile 办法返回,不蕴含还是走失常的查问逻辑。
php 复制代码
location = /api/data/preview {
set $upstream 'fe_full_long';
access_by_lua_block {function getFile(file_name)
local f = assert(io.open(file_name, 'r'))
local string = f:read("*all")
f:close()
return string
end
ngx.req.read_body()
local data = ngx.req.get_body_data()
if ngx.re.match(ngx.var.request_body, "file_id") then
ngx.say(getFile(string.format("/nginx/conf/conf.d/a.txt", f)));
return
end
}
proxy_pass http://$upstream;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
保留 nginx -t,先查看后重启,避免手心冒汗,简略测了一下性能间接腾飞,间接提供给第三方测试了。
亿级数据毫秒级响应?
早晨上班前发过来了初版的测试报告,组长一看,间接给我阅起兵来了,” 你这也太快了,搂着点啊,管家指标还一样,快改改 ”。
我一看好家伙,亿级数据 28 毫米返回,雀氏有点难堪了。。。。连忙改改。在 lua 脚本里 sleep 随机几百毫秒就实在了。
lua 复制代码
— 定义睡眠函数
local function sleep(ms)
ngx.sleep(ms / 1000)
end
— 随机睡眠一段时间(1 毫秒到 100 毫秒之间)
math.randomseed(ngx.now())
local sleepTime = math.random(1, 100)
sleep(sleepTime)
重启下 nginx 重测,后果很正当,必须得在周报浓墨重彩一波。。。