我的工作,其从多个地理上分布的节点的上传包括Flash视频文件到S3桶的项目。

在视频文件约2-3mb每个,并且我们只发送一个文件(每个节点)每十分钟,然而带宽我们消耗需要被速率限制为〜20K /秒,因为这些节点被递送流媒体的CDN,并且由于位置,我们只能得到512k的最大上传

我一直在寻找到ASW-S3的宝石,虽然它不提供任何形式的速率限制,我知道,你可以在一个IO流通过。鉴于此,我想知道是否有可能建立一个速率受限流将覆盖read方法,在速率限制逻辑增加(例如,在最简单的形式调用读取之间sleep),然后调出的超级重写的方法。

我考虑的另一个选项是黑客的代码网:: HTTP和把速率限制到其使用send_request_with_body_stream回路while方法,但我不完全知道这将是最好的选择。

我试图在扩展IO类,但是这并没有在所有的工作,简单地用class ThrottledIO < IO类继承什么也没做。

任何建议,将不胜感激。

有帮助吗?

解决方案

您需要的,如果你想“增加”的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

其他提示

我们已经使用了 aiaio的active_resource_throttle 以从收获API拉动项目限制的请求工作中。我没有设置它,但它的作品。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top