Play Iteratee 限制

Play Iteratee throttling

提问人:AndrewSwerlick 提问时间:9/29/2013 更新时间:5/12/2014 访问量:434

问:

我正在使用 scala 和 Play 编写一个流式网络广播框架。我依靠 Iteratees 进行实际的流式处理,但我遇到了一个问题,试图防止贪婪的客户端过快地下载数据,并为所有客户端消耗流。为此,我一直在尝试创建一个枚举器,该枚举器将限制枚举器生成数据的速度。这是我的枚举的样子

val throttlingIteratee = Iteratee.foldM[Array[Byte], Array[Byte]](new Array[Byte](0)) {
(result, chunk) => 
  val prom = Promise[Array[Byte]]()
  timer.schedule(new TimerTask{
    def run() = prom.success(result ++ chunk)
    },1000)
  prom.future    
}

private val chunker = Enumeratee.grouped(  
    Traversable.take[Array[Byte]](31792) &>> throttlingIteratee  
)

这个想法是,我使用计时器任务创建一个 throttlingIteratee 并将其与 Enumeratee.grouped 函数配对。这似乎工作得很好,但是我无法确定要为块大小使用什么值。我想让它以与音频播放大致相同的速度产生块。我的音频文件以 82kpbs 编码,我试图以字节为单位进行计算,但我得出的值似乎太小了,而且音频播放速度快于流式传输的数据。

我的问题有两个方面。我所拥有的基本方法是否是一个好方法?如果是,我该如何根据音频文件的比特率设置块大小。

斯卡拉 PlayFramework-2.0 循环

评论


答:

0赞 vptheron 5/12/2014 #1

有几件事:

  • 1 kbps = 每秒 1000 位 = 每秒 125 字节。因此,在您的情况下,每秒 10,250 字节。
  • 我看不出你的代码有任何问题。为了清楚起见,我假设您剥离了代码以处理失败。
  • 我不知道您的用例,但我认为在代理或 Web 服务器中设置这种类型的限制可以更容易地完成,而不是在您的代码中。

评论

0赞 AndrewSwerlick 5/13/2014
谢谢,我已经有一段时间没有碰过这个了,但我会尝试挖掘我的旧代码并在本周末测试你的数字,这样我就可以接受这个答案了