我正在开发一个项目,该项目涉及将 Flash 视频文件从多个地理分布的节点上传到 S3 存储桶。
每个视频文件约为 2-3mb,我们每十分钟仅发送一个文件(每个节点),但是我们消耗的带宽需要将速率限制在 ~20k/s,因为这些节点将流媒体传输到CDN,由于位置的原因,我们只能获得 512k 的最大上传量。
我一直在研究 ASW-S3 gem,虽然它不提供任何类型的速率限制,但我知道您可以传入 IO 流。鉴于此,我想知道是否有可能创建一个速率限制的流来覆盖read
方法,添加速率限制逻辑(例如,以最简单的形式调用sleep
读取之间),然后调用被重写方法的 super。
我考虑的另一个选择是破解 Net::HTTP 的代码并将速率限制放入send_request_with_body_stream
方法是使用while
循环,但我不完全确定哪个是最好的选择。
我尝试扩展 IO 类,但这根本不起作用,只是从该类继承class ThrottledIO < IO
没有做任何事情。
任何建议将不胜感激。
如果你想“增强”IO,你需要使用Delegate。这会在 IO 对象周围放置一个“外观”,该外观将由对象的所有“外部”读取器使用,但不会影响对象本身的操作。
我把它提取到一个 gem 中,因为它被证明是普遍有用的
下面是一个 IO 读取的示例
http://rubygems.org/gems/progressive_io http://rubygems.org/gems/progressive_io
这里有一个方面添加到所有阅读方法中。我认为你也许可以扩展它来进行基本的限制。完成后,您将能够将您的文件打包到其中:
throttled_file = ProgressiveIO.new(some_file) do | offset, size |
# compute rate and if needed sleep()
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)