代码之家  ›  专栏  ›  技术社区  ›  Matthew Savage

速率限制Ruby文件流

  •  3
  • Matthew Savage  · 技术社区  · 15 年前

    我正在做一个项目,该项目涉及从多个地理上分布的节点将Flash视频文件上传到S3存储桶。

    每个视频文件大约2-3MB,我们每10分钟只发送一个文件(每个节点),但是我们消耗的带宽需要限制在~20k/s的速率,因为这些节点正在向一个cdn交付流媒体,并且由于位置的原因,我们只能获得512K的最大上载。

    我一直在研究ASW-S3 gem,虽然它不提供任何速率限制,但我知道您可以通过IO流。鉴于此,我想知道是否可以创建一个速率限制流来覆盖 read 方法,在速率限制逻辑中添加(例如,以最简单的形式调用 sleep 然后调用重写方法的父级。

    我考虑的另一个选项是对net::http的代码进行黑客攻击,并将速率限制放在 send_request_with_body_stream 使用的方法 while 循环,但我不完全确定哪一个是最好的选择。

    我尝试扩展IO类,但是这根本不起作用,只是从类继承 class ThrottledIO < IO 什么都没做。

    任何建议都将不胜感激。

    2 回复  |  直到 13 年前
        1
  •  4
  •   Julik    13 年前

    如果要“扩充”IO,则需要使用委托。这会在IO对象周围放置一个“外观”,对象的所有“外部”读卡器都将使用它,但不会对对象本身的操作产生影响。

    我把它提取到一块宝石里,因为它被证明是普遍有用的。

    下面是一个IO的例子

    http://rubygems.org/gems/progressive_io

    这里有一个方面添加到所有的阅读方法中。我想你可以把它扩展到基本节流。完成后,您将能够将自己的文件打包到其中:

     throttled_file = ProgressiveIO.new(some_file) do | offset, size |
        # compute rate and if needed sleep()
     end
    
        2
  •  0
  •   easement    15 年前

    我们已经使用了 aiaio's active_resource_throttle 限制在工作的项目上从Harvest API中提取的请求。我没有设置,但它起作用了。

    推荐文章