我正在开展一个项目,该项目涉及将Flash视频文件从多个地理位置分散的节点上传到S3存储桶。
每个视频文件大约2-3mb,我们每十分钟只发送一个文件(每个节点),但我们消耗的带宽需要限制在~20k / s,因为这些节点正在提供流媒体到CDN,由于位置我们只能获得512k最大上传。
我一直在研究ASW-S3 gem,虽然它没有提供任何速率限制,但我知道你可以传入IO Stream。鉴于此,我想知道是否有可能创建一个覆盖read
方法的速率限制流,添加速率限制逻辑(例如,以最简单的形式在读取之间调用sleep
)然后调用覆盖方法的超级。
我考虑的另一个选项是攻击Net :: HTTP的代码并将速率限制放入使用send_request_with_body_stream
循环的while
方法,但我不完全确定哪个是最好的选择。
我试图扩展IO类,但是根本不起作用,只是从具有class ThrottledIO < IO
的类继承没有做任何事情。
任何建议都将不胜感激。
答案 0 :(得分:4)
如果要“扩充”IO,则需要使用Delegate。这会在IO对象周围放置一个“Facade”,该对象将被对象的所有“外部”读者使用,但不会对对象本身的操作产生影响。
我已将其提取到宝石中,因为它被证明通常是有用的
以下是从
读取的IO的示例http://rubygems.org/gems/progressive_io
这里有一个方面添加到所有阅读方法。我想你可以扩展它来进行基本的限制。完成后,您将能够将您的文件包装到其中:
throttled_file = ProgressiveIO.new(some_file) do | offset, size |
# compute rate and if needed sleep()
end
答案 1 :(得分:0)
我们使用aiaio's active_resource_throttle来限制在工作项目中从Harvest API中提取请求。我没有设置它,但它确实有效。