【问题标题】:How to implement and limit API calls per second in Spring Rest如何在 Spring Rest 中实现和限制每秒 API 调用
【发布时间】:2021-01-12 00:36:01
【问题描述】:

我有带有 spring MVC 的 spring 批处理应用程序。在这个应用程序中,我必须调用 Google API。 API 有每秒最多 4 个请求的限制。现在我必须从 Spring Batch 中调用 google API。所以我有两个问题。

q1:如何实现对 Google API 的休息调用。我知道 Rest Template,但我希望有更好的方法,比如我们在微服务中使用的 feign 客户端。

q2:如何限制每秒 4 个调用。

如果您有任何问题。请告诉我

【问题讨论】:

  • 如果每秒有 5 次调用,您希望发生什么?放弃第 5 次通话(例如返回错误)或再等一秒钟,这样您就不再受到速率限制?您可能对这样的事情感兴趣:stackoverflow.com/questions/31883739/…
  • 您需要使用什么 Google API?
  • 实际上,我在春季批次中使用了这个逻辑,我对 Google API 有连续 15K 的点击。但是 API 每秒有 4 个请求的限制,所以我不想对 Google API 造成更多影响,因为可能存在一些成本问题。
  • @TomVanRossom maps.googleapis.com

标签: spring spring-boot spring-batch spring-restcontroller


【解决方案1】:

您可以使用 RateLimiter 限制每秒 API 调用。在Guava中实现了一个

您需要创建RateLimiter 并告知每秒多少次调用。

final RateLimiter rateLimiter = RateLimiter.create(4.0); // rate is "4 permits per second"

每次想要限制时,都需要获得许可。如果使用了所有许可,则等待执行。

rateLimiter.acquire(1);

还可以指定等待许可的超时时间。

【讨论】:

  • java 中是否有相同的实现?
  • @VimitDhawan 这是 Java 吗?
  • 是的,这是 Java!
  • @TomVanRossom 谢谢
  • @TomVanRossom 你能不能给我任何关于 1 个问题的建议
【解决方案2】:

在我们的 spring-boot 项目中,我们使用 OkHttpClient3 作为 http 客户端。我们还对许多不同的公共 API 进行休息调用。其中一些限制每秒调用次数。作为解决方案,我们实现了一个称为 DelayInterceptor 的拦截器。

基本上;创建一个实现okhttp3.Interceptor 的Java 类。 在它的 public Response intercept(Chain chain) 方法中,使用 chain.request().url().host() 查找您请求的主机(以区分对不同公共 API 的调用),如果您已调用此主机,请使用 Thread.sleep(amount);

由于我们的项目相对较新,我们没有分析可能的缺点,但到目前为止它确实有效。

P.S:您也可以查看AsyncHttpClient 项目,该项目已经有解决此问题的方法(尽管我无法通过简单的谷歌搜索找到)。

【讨论】:

    【解决方案3】:

    我创建了可用于限制 API 的 RateLimiter。它是您可以为 API 改进和实现的线程的通用解决方案。

    Rate Limiting API

    【讨论】:

      猜你喜欢
      • 2017-07-04
      • 2017-08-13
      • 2010-09-12
      • 2018-02-04
      • 2015-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多