限制Ruby文件流的速率

3

我正在从多个地理分布式节点上传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”并没有做任何事情。

非常感谢您的建议。

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

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接