Moon's blog

write the code, change the world.

请求优化-百倍性能提升

发现慢请求

我们的整个web服务是基于Rails的,应用服务器是基于多进程模型的unicorn,因此,慢请求会对系统造成比较大的影响。

最近又到了春节促销活动时期,为了更及时地发现整个后端系统的问题,我基于Kibana的Visulize功能制作了一个慢请求监控图

通过这个统计图,可以很方便的看出过去N分钟内,响应时间最慢的接口分布情况。

优化-Cache

对于图中这个api/v1/publishers接口,会出现很多耗时100ms以上的请求,这个接口做了以下几件事。

  1. 查询数据库,加载一个几乎不怎么变动的publisher列表
  2. 渲染成json返回

显而易见的优化策略就是cache掉数据库查询,做完这一步的确也能获得比较大的提升,普通的优化工作可能到这一步就结束了。

但是还有一个特殊的地方,这个列表可能有几百个条目,相对来说还是比较大的。而ruby在做这种CPU密集的渲染时,性能是非常差的。因此,也要想办法解决掉渲染的问题。

优化-Render

只render一次。

相比于之前cache数据库查询的结果的方式,这次在代码中计算出最终返回的json,直接cache这个json字符串。

然后,在渲染的时候,使用渲染文本,并手动设置content-type的方式来返回json

1
render plain: "字符串", content_type: 'application/json'

效果

做完以上两步,在日志中观察到单个请求的时间降低到0.8ms左右!

Future

以上优化差不多是Rails框架内的极致,再往上,可以考虑直接把数据静态化成json文件,交给Nginx管理。