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 的未来的主要内容,如果未能解决你的问题,请参考以下文章
每天laravel-20160624|RateLimiter