RateLimiter 的未来

Posted

技术标签:

【中文标题】RateLimiter 的未来【英文标题】:Future with RateLimiter 【发布时间】:2021-08-03 16:03:26 【问题描述】:

假设我有一个像这样的简单阻塞 HTTP 客户端:

def httpGet(url: URL): Future[String] = ??? 

现在我想用httpGet调用一个有请求速率限制的服务器;例如1000 个请求/秒。由于标准库不提供速率限制器,我将使用RateLimiter of Guava:

import com.google.common.util.concurrent.RateLimiter
import scala.concurrent.ExecutionContext, Future, blocking

def throttled[A](fut: => Future[A], rateLimiter: RateLimiter)
                (implicit ec: ExecutionContext): Future[A] = 
  Future(blocking(rateLimiter.acquire())).flatMap(_ => fut)


implicit val ec = ExecutionContext.global
val rateLimiter = RateLimiter.create(permitsPerSeconds = 1000.0)
val throttledFuture = throttled(httpGet(url), rateLimiter)

这有意义吗? 你会使用另一个执行上下文来执行rateLimiter.acquire() 吗?

【问题讨论】:

【参考方案1】:

由于您在acquire 周围使用blocking,所以没关系,IMO。

根据调用httpGet 的线程完成了多少工作,如果您使用的是Scala 2.13,则可能值得考虑使用parasitic 执行上下文。

风格 nit,但可能值得利用 Scala 使用 围绕单个参数列表的能力:

def throttled[A](rateLimiter: RateLimiter)(fut: => Future[A])(implicit ec: ExecutionContext): Future[A]

val throttledFuture = throttled(rateLimiter)  httpGet(url) 

【讨论】:

感谢您的建议。我在 2.12,所以我不能使用parasitic。喜欢风格备注:我会用。

以上是关于RateLimiter 的未来的主要内容,如果未能解决你的问题,请参考以下文章

限流工具RateLimiter

使用Guava RateLimiter限流

Guava官方文档-RateLimiter类

每天laravel-20160624|RateLimiter

找不到错误类“Illuminate\Support\Facades\RateLimiter”

Guava的RateLimiter在单机限流中的正确用法