ruby-china / rubygems-mirror

https://gems.ruby-china.com
MIT License
327 stars 31 forks source link

实现新的 Proxy Cache Server #9

Closed huacnlee closed 8 years ago

huacnlee commented 8 years ago
                  [GET /gems/foo-1.0.0.gem]
                             |
                          [Nginx]
                             |
                        [My Proxy App]
                             |
                          {Router}
                             |
             ------------------------------------
             |                                  |
    [cache hit no expire]             [cache miss/expired]
             |                           |              |
  [response cache file] ------------------       [async fetch new data]
             |                                     |                 |
        [status 200]                   [success: rewrite cache]   [fail: do noting]
huacnlee commented 8 years ago

Nginx 的 proxy_cache_use_stale 就是干这个事情的

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_use_stale

alsotang commented 8 years ago

image

静态文件这一块,我建议使用腾讯云 cos 的回源服务。这些静态文件一般都是不会变更的文件。

所以当你使用 cos 之后,用户第一次访问以后,这些文件会被存储在 cos 上面。下次再访问就是从国内网络直接获取了。

rubygems.conf 里面的 location ~ /(gems|quick)location ~* \.(4.8|4.8.gz) 可以由服务器返回一个 302 到 http://your-cos-appname.qcloud.com/gems/rails.gz 这样的请求。

用户在拿到这个请求之后,直接去请求 cos。

nginx 里面,首页和 api 页面,继续访问国外主机。gems 和 .gz 的文件也访问国外主机,但是主机吐个 302 出来。

cdn这东西,如果你的文件是经常被访问的,并且设置了缓存时间,那么它有加速效果。可是动态请求的话,由于腾讯云国外主机本身的网络也不算差的,所以加上了 cdn 反而多了一个网络层。并且 cdn 上面的文件是会过期的,虽然你可以设置缓存时间是1年。但它只会在不停有用户访问的时候,才缓存一年,一年后再进行一次回源,不可能在用户访问少的情况下一直占着硬盘。

所以对于你这边各种零散的 gems 来说,他们的 gz 文件很可能是不在 cdn 的缓存中的,也就是说按你现在的配置,每次用户下载非著名 gem 的时候,他的网络请求的大部分流量都会从你的国外主机回国内。而使用了 cos 之后,用户的大部分流量可以在国内消耗掉。cos 是会永久存储的,只是更新策略比较不灵活。

ps:我以上都是假设你们的 file cache 策略都是针对不会被更新的情况。如果情况不符,那我这建议也没用。


腾讯云cdn这块,今天跟内部交流的结果是,目前我们的业务重点还是在国内用户。国外的回源质量有待提升。(咳咳,我说得比较委婉)

假设现在你用了一个很牛逼的 cdn,国外回源质量好,以及假设cdn层没有任何的网络损耗。ok,那么首页不会像今天一样经常502。我们能想到的最好情况就是用了cdn和直接访问源站的动态请求速度是一样的。

但是,我上述的非著名 gem 慢的问题。还是会存在。在用了很牛逼 cdn 的情况下,由于文件没有被 cdn 缓存,流量大部分不命中,而是回源。一个北京用户装了 rails 的包,只能让北京的一个边缘节点缓存上这个包。腾讯云cdn在国内成百上千的边缘节点,想让这些节点都缓存也太难了。 还是把文件弄到国内来吧。

ps:我之所以觉得 gems.ruby-china.org 流量不足以让 cdn 发挥太多作用,是参考了 http://npm.taobao.org/ 的下载量级。

lgn21st commented 8 years ago

不确定 cos 在文件首次请求回源是否可靠?如果速度和稳定性都不错的话,我觉得可以试试 cos。

alsotang commented 8 years ago

@lgn21st cos的海外回源稳定性,我问问cos那边的人有没有香港回源专线可以用。可以用的话我就去申请一个。

alsotang commented 8 years ago

cos的问题等我问问再给你们答复。现在出于安全策略不允许海外回源。。。。。。。。。。。。。。。。。。。。。。。。。

huacnlee commented 8 years ago

已实现,部署