如何在 Scala 中实现速率限制器?

Fed*_*aso 3 scala guava akka

我想在 Scala 中使用 RateLimiter 来限制方法调用的频率。

我需要类似于番石榴实现的东西:http : //docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/util/concurrent/RateLimiter.html

我知道我可以在本地使用 Guava,但我想知道在 Scala 中是否有更好的本地解决方案,无论有没有 Akka

Rex*_*err 5

就个人而言,我会使用番石榴。但是您可以使用期货来创建自己的产品而不会遇到太多困难。

class RateLimiter(delayMs: Int) {
  private[this] var last: Long = System.currentTimeMillis
  private[this] val done = scala.actors.Futures.alarm(0)
  def request = {
    val now = System.currentTimeMillis
    val elapsed = synchronized {
      val elapsed = now - last
      last = if (elapsed < delayMs) last+delayMs else now
      elapsed
    }
    if (elapsed < delayMs) scala.actors.Futures.alarm(delayMs-elapsed)
    else done
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,您为要限制访问的每个方法或一组方法创建一个限制器,并通过调用启动该方法request()Future如果需要,这将使用 a来阻止。如果你想要的不是至少这么多毫秒的间隔,你只需要改变一点数学和/或跟踪更多的状态。