作为一名深陷在增删改查泥潭中练习时长三年的夹娃练习生,偶然会因为没有开发工作不晓得周报写什么而苦恼。
正愁这周写啥呢,组长过去交代了个跟进第三方公司性能测试报告的工作,我一寻思这活不最好干了吗,正愁不晓得周报咋写呢,又能提现工作量又不累,本认为轻松拿捏的后果差点让老弟翻车。
因为咱们组次要做数仓治理这块的业务,这次的性能测试上有一些数据服务并发相干的指标须要后端配合测试,让一天搞定,我寻思半天搞完还能去掘金狠狠的摸半天鱼,岂不美哉。拿到测试指标之后间接手心出汗了。
啥意思,亿级数据查问毫秒级响应还要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 stringend
找到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重测,后果很正当,必须得在周报浓墨重彩一波。。。