3

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

每个视频文件大约 2-3mb,我们每十分钟只发送一个文件(每个节点),但是我们消耗的带宽需要限制在 ~20k/s,因为这些节点将流媒体传输到CDN,并且由于位置的原因,我们最多只能上传 512k。

我一直在研究 ASW-S3 gem,虽然它不提供任何速率限制,但我知道您可以传入 IO 流。鉴于此,我想知道是否有可能创建一个覆盖该read方法的速率限制流,添加速率限制逻辑(例如,以最简单的形式sleep在读取之间调用),然后调用被覆盖的超方法。

我考虑的另一个选择是破解 Net::HTTP 的代码并将速率限制放入send_request_with_body_stream使用while循环的方法中,但我不完全确定哪个是最佳选择。

我曾尝试扩展 IO 类,但这根本不起作用,只是从类中继承class ThrottledIO < IO并没有做任何事情。

任何建议将不胜感激。

4

2 回答 2

4

如果你想“增加”一个 IO,你需要使用 Delegate。这会在您的 IO 对象周围放置一个“外观”,该对象的所有“外部”读取器都将使用该外观,但不会影响对象本身的操作。

我已将其提取到宝石中,因为事实证明它通常很有用

这是一个从 IO 读取的示例

http://rubygems.org/gems/progressive_io

这里有一个方面添加到所有阅读方法。我认为您可以将其扩展为进行基本的节流。完成后,您将能够将文件包装到其中:

 throttled_file = ProgressiveIO.new(some_file) do | offset, size |
    # compute rate and if needed sleep()
 end
于 2010-03-15T17:15:52.587 回答
0

我们已经使用aiaio 的 active_resource_throttle来限制从 Harvest API 拉取工作项目的请求。我没有设置它,但它可以工作。

于 2010-03-15T14:21:22.047 回答