如何降低通过REST API发送数据的延迟
我有一个应用程序,它从我们其他的服务器获取JSON格式的数据。现在我遇到的问题是,获取这些信息时会有明显的延迟。因为每次请求的数据量很大(大约1000条记录,每条记录都很庞大),所以我想知道压缩是否能帮助减少这个延迟。如果可以的话,你推荐使用哪种压缩方式。
我在另一个讨论串中看到,数据的模式对需要使用的压缩类型也有很大影响。我的数据模式是比较一致的,类似于以下内容:
:desc=>some_description
:url=>some_url
:content=>some_content
:score=>some_score
:more_attributes=>more_data
有没有人能推荐一个解决方案,帮我减少这个延迟?现在的延迟大约是6到8秒。我正在使用Ruby on Rails来开发这个应用,而提供数据的服务器大部分是用Python编写的。
2 个回答
gzip是一种可以大幅度减小文本数据大小的工具,它能让你的网站加载速度更快。这个方法也得到了YSlow的推荐。
我首先会看看这8秒的延迟中,有多少是跟以下几个方面有关的:
服务器端处理(生成数据花了多长时间)
有很多方法可以改善这个时间,包括:
数据库索引
缓存
更快的 to_json 库
一些很不错的资源是 NewRelic 关于 Rails 可扩展性的播客,链接在这里:http://railslab.newrelic.com/2009/02/09/episode-7-fragment-caching
传输延迟(数据在服务器和客户端之间发送花了多长时间)
如果数据的键基本相同,你可以考虑使用来自 JSON 编码数据包的压缩算法 的解决方案;你可能还想看看 https://github.com/WebReflection/json.hpack/wiki/specs-details 和 http://www.nwhite.net/?p=242
此外,你还可以从前端服务器进行压缩(gzip),相关链接有:http://httpd.apache.org/docs/2.0/mod/mod_deflate.html 和 http://wiki.nginx.org/NginxHttpGzipModule
如果数据结构是固定的,你还可以尝试实现一个二进制服务,这样会快很多,还能压缩,但维护起来会比较复杂,比如使用 thrift:http://www.igvita.com/2007/11/30/ruby-web-services-with-facebooks-thrift/
如果这适合你的需求,或许你可以在服务器端做一个版本控制/缓存系统,只发送那些被修改过的记录(不过这实现起来会比较复杂)