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

标签 scala guava akka

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

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

我知道我可以原生使用 Guava,但我想知道 Scala 中是否有更好的原生解决方案,有或没有 Akka

最佳答案

就我个人而言,我会使用 Guava。但是您可以使用 futures 轻松创建自己的。

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
  }
}

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

关于scala - 如何在 Scala 中实现速率限制器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12617801/

相关文章:

scala - Clojure GUI 编程很难

java - Guava 可选字符串或带前缀

java - 如果主机名是 "localhost",创建 HostAndPort-Instance 最简单的方法是什么?

java - com.google.common.io.ByteArrayDataInput 的替代方案?

akka - 提高 Akka 远程吞吐量

scala - 如何提取RDD中字符串的一部分?

scala - 如何将 Haskell 翻译成 Scalaz?

mysql - "Hello World"使用 MySQL 的 Slick 2.0 示例

scala - 如何为 akka-camel 端点启用 JMX 监控

scala - 如何在 Actor 的接收方法中使用 Future 来处理容错?