架构:管理 API 密钥池

问题描述

背景:

  • 我正在使用谷歌自己的 custom search JSON API 在我们的平台上启用谷歌搜索

  • 该平台是一个 multi-tenant 架构,其中每个租户可以拥有多个用户

  • 每个 10K 键的每日调用次数上限为 API,因此我们计划必须合并以满足客户的需求。

  • 这个API会被前端代码(UI)直接调用

寻找可能的解决方案:

  1. 用户登录平台网站时,从池中向前端逻辑提供一个有效的密钥(请注意,用户可能使用也可能不使用嵌入式谷歌搜索,但前端应始终拥有一个有效的密钥,以防万一用户执行嵌入式谷歌搜索)。
  2. 跟踪 API 密钥的使用次数,以了解密钥何时用完其配额。
  3. 使用什么样的存储来存储这些密钥?
  4. 对租户或用户启用“速率限制”,以便每个人都能公平地分享可用呼叫总数。

解决方法

首先,从安全角度来看,这种通过访问 API 密钥直接调用外部 API 的 UI 想法对我来说并不好。在调用外部 API 之前,我仍会考虑使用薄后端层来验证请求。

现在对于您的问题,Google API 已经有monitor API usage 的方法,这是我首先要考虑的,因为根据您的应用程序的规模,跟踪 API 使用情况可能难以管理.

您还可以设置 API usage per user 的上限,以确保您不会达到 10K 的限制,这实际上是您要寻找的 - 如果用户达到分配的配额,则对用户进行速率限制。据我所知,这适用于某些 Google API,需要检查一下它是否也适用于搜索 API。

现在,如果您有充分的理由自己动手,您可以将键存储在快速的 No-SQL 缓存中,例如 Redis。它可能需要一些自定义逻辑来始终为您提供调用次数最少的 API 密钥,但这可以确定。

可以使用 Bucket4J 或类似的库进行速率限制。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...