-
20-09-2019 - |
题
我的工作,其从多个地理上分布的节点的上传包括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拉动项目限制的请求工作中。我没有设置它,但它的作品。
不隶属于 StackOverflow