Gem [投票] ruby.taobao.org 是否要 proxy rubygems 的 API 请求

ruohanc · 2014年08月05日 · 最后由 huacnlee 回复于 2014年10月01日 · 5432 次阅读

起源是 @pynic 发的帖子 淘宝源问题

因为淘宝 gems 镜像只是简单的 mirror 了上游的 gems 包 (使用工具 rubygems-mirror), 上传到阿里云 oss 之后再用 nginx 做前端做了一个 302 重定向实现的。

因为本地没有任何应用跑着,所以 api 请求在本地肯定是无法服务了,之前 @huacnlee 的解决方案是给 api 请求加了一个 proxy 到 https://rubygems.org

从我个人的使用感受上来说,加了这个 proxy 后 gems 的安装速度反而变慢了,因为从中国去 rubygems 的线路确实不好,就算在阿里的机房也没有明显优势。

区别

proxy api

代理 api 请求之后在 gem install 的时候就会精确的获得 gems 的依赖关系,通过少量的 API 请求 来生成依赖图,然后下载对应的包

api 404

api 请求 404 之后就会转而去下载 specs.4.8.gz 文件,拿到完整的 gem specs 列表,然后再去请求每个被安装 gems 的所有版本的 gemspec 文件

GET https://rubygems-china.oss.aliyuncs.com/quick/Marshal.4.8/thread_safe-0.1.1.gemspec.rz
200 OK
GET https://ruby.taobao.org/quick/Marshal.4.8/thread_safe-0.1.1-java.gemspec.rz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/quick/Marshal.4.8/thread_safe-0.1.1-java.gemspec.rz
200 OK
GET https://ruby.taobao.org/quick/Marshal.4.8/thread_safe-0.1.2.gemspec.rz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/quick/Marshal.4.8/thread_safe-0.1.2.gemspec.rz
200 OK
GET https://ruby.taobao.org/quick/Marshal.4.8/thread_safe-0.1.2-java.gemspec.rz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/quick/Marshal.4.8/thread_safe-0.1.2-java.gemspec.rz
200 OK
GET https://ruby.taobao.org/quick/Marshal.4.8/thread_safe-0.1.3.gemspec.rz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/quick/Marshal.4.8/thread_safe-0.1.3.gemspec.rz
200 OK
GET https://ruby.taobao.org/quick/Marshal.4.8/thread_safe-0.1.3-java.gemspec.rz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/quick/Marshal.4.8/thread_safe-0.1.3-java.gemspec.rz
200 OK
GET https://ruby.taobao.org/quick/Marshal.4.8/thread_safe-0.2.0.gemspec.rz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/quick/Marshal.4.8/thread_safe-0.2.0.gemspec.rz
200 OK
GET https://ruby.taobao.org/quick/Marshal.4.8/thread_safe-0.2.0-java.gemspec.rz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/quick/Marshal.4.8/thread_safe-0.2.0-java.gemspec.rz
200 OK
GET https://ruby.taobao.org/quick/Marshal.4.8/thread_safe-0.3.1.gemspec.rz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/quick/Marshal.4.8/thread_safe-0.3.1.gemspec.rz
200 OK
GET https://ruby.taobao.org/quick/Marshal.4.8/thread_safe-0.3.1-java.gemspec.rz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/quick/Marshal.4.8/thread_safe-0.3.1-java.gemspec.rz

投票

其实就是征集下反馈:

  • 最近两个月的 gems.taobao.org 访问速度 (开了 api 的 proxy), 比起之前的访问速度如何,更好了还是更差了?应该继续打开这个 API Proxy 还是任由它 404, 还是说有人有兴趣写一个应用来提供本地的 API 服务?

注:现在 API 是 Proxy 的,即每次请求都会在后端请求到 https://rubygems.org

API Proxy 的速度这样感受:

curl https://ruby.taobao.org/api/v1/dependencies?gems=rails

我的感觉是明显快了。。。至少是第一次响应速度……

额,这个没来得及注意啊.... 刚刚对比了下 API Proxy 的速度,给一个数据。(湖南长沙,8M 电信)

我能说 我根本没注意这些细节么?不过遇到过有些(个)包 taobao 源装不上 换回官方源就装上了的情况

@ruohanc 沟通了一下,目前 api 代理的反馈信息是与主站一致的,而由于 mirror 与主站存在滞后,结果从同样的 ruby.taobao.org 服务器上送出的 gem 包服务和 api 查询有错位,这个其实不太合理,我也觉得最好在 ruby.taobao.org 服务器上自己做 api 服务比较好,在这个功能开发出来以前,先关闭 api。

对使用者来说,直接用 ruby.taobao.org 上的 spec 文件比代理到远程去主站的 api 可能反而更快

#4 楼 @xworm 这是必然的,因为有延时,分布式系统本来就面临来自 CAP 的矛盾,目前的延时应该说还不大,我印象中是半小时左右。

#6 楼 @fsword #4 楼 @xworm

现在同步脚本是 5 分钟跑一次。但是具体运行时间的长短就要看网络质量了..

所以说现在服务挂了?!

#8 楼 @cassiuschen

确实挂了。

明早不敢部署了。

#9 楼 @xiaoronglv -0-...要不要这么夸张.....我看到 @huacnlee 已经把 api proxy 给注释掉了...

#10 楼 @ruohanc 昨天是 rubygems.org 官方异常

我发现差别了,API 的反向代理必须得开,不然 --pre 的 Gem 无法正确安装

没开启的时候

$ gem install rails --pre -V
GET https://ruby.taobao.org/prerelease_specs.4.8.gz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/prerelease_specs.4.8.gz
200 OK
GET https://ruby.taobao.org/latest_specs.4.8.gz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/latest_specs.4.8.gz
200 OK
HEAD https://ruby.taobao.org/api/v1/dependencies
404 Not Found
GET https://ruby.taobao.org/specs.4.8.gz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/specs.4.8.gz
200 OK
ERROR:  While executing gem ... (Gem::UnsatisfiableDependencyError)
    Unable to resolve dependency: 'rails (= 4.2.0.beta2)' requires 'railties (= 4.2.0.beta2)'

导致无法解析到正确的版本依赖关系,无法安装成功。

开启以后

$ gem install rails --pre -V
GET https://ruby.taobao.org/prerelease_specs.4.8.gz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/prerelease_specs.4.8.gz
200 OK
GET https://ruby.taobao.org/latest_specs.4.8.gz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/latest_specs.4.8.gz
200 OK
HEAD https://ruby.taobao.org/api/v1/dependencies
200 OK
GET https://ruby.taobao.org/api/v1/dependencies?gems=rails
200 OK
GET https://ruby.taobao.org/api/v1/dependencies?gems=railties
200 OK
GET https://ruby.taobao.org/api/v1/dependencies?gems=activesupport
200 OK
GET https://ruby.taobao.org/api/v1/dependencies?gems=actionpack
200 OK
GET https://ruby.taobao.org/api/v1/dependencies?gems=actionview
200 OK
... 省略 N 多的依赖检查 ...
GET https://ruby.taobao.org/quick/Marshal.4.8/activesupport-4.2.0.beta2.gemspec.rz
302 Moved Temporarily
GET https://rubygems-china.oss.aliyuncs.com/quick/Marshal.4.8/activesupport-4.2.0.beta2.gemspec.rz
200 OK
Downloading gem rails-4.2.0.beta2.gem
... 安装成功
需要 登录 后方可回复, 如果你还没有账号请 注册新账号