如何使用Mongodb设计具有多个API密钥的基于订阅的API服务?



>假设我有一个提供一些服务的API。用户必须至少有一个 api 密钥才能发出请求。假设您每月免费获得 1,000 个请求,如果您想要更多,则需要按月支付订阅费用。

您将如何使用mongodb存储此业务模型并根据每月请求计数应用速率限制?

我正在使用节点.js

有很多方法可以解决这个问题,所以这是我的 2 美分。

我已经做了一些类似于您使用 Stripe(用于管理计划和付款处理(和 MongoDb(用于存储用户相关数据(之后的事情。它可能不完全是你想要的,但可能会激发一些想法。

在MongoDB上

MongoDB将保留您的用户API请求计数。此计数可用于接受/拒绝请求,具体取决于您的业务规则。

假设您在 MongoDb(或类似(上有一个 Users 集合,您应该做出设置以"计数"用户发出的成功请求。这可以是具有关联时间戳属性的简单计数器属性(以便您知道何时应该重置它,即一个月后(。除非您有正当理由,否则请避免计算失败的请求(即导致 4XX5XX 响应的 API 请求(

本质上,在用户 API 请求成功后,检查计数器是否仍然有效(即在一个月内(并增加计数 - 如果一个月已经过去了,则从 0 开始计数。您可以使用"$inc"运算符来递增数字,而不是自己递增它们。

至于它应该如何在MongoDB中表示,它可以是这样的(在用户文档中(:

{
  ...
  "apiUsage" : {
    "requestsThisMonth" : 850,
    "updatedAt": "2019-11-21T10:10:10.100Z"
  }
}

在条纹上

Stripe 将用于记录一段时间内进行的检查次数,并相应地向您的用户收费。

Stripe 提供了创建定价计划的方法,然后您可以将其与您的用户关联。在这种情况下,您可以创建按月计量的使用计划,采用分层定价。可以设置分层定价,以便前 1,000 个单位(即 API 请求(免费(0.00 美元(。一旦它们超过 1000 个单位,您就可以开始充电。

客户订阅计划后,您可以使用 Stripe API 来增加使用量。

高水平流量

  1. 用户发出 API 请求
  2. 您的服务检查MongoDB并决定是要满足还是拒绝请求。您可以出于用户支付卡已过期、超出上限阈值等原因拒绝。
  3. 您的服务满足/拒绝请求
  4. MongoDB 中的增量计数,如果请求得到满足
  5. 条带中的增量计数(如果请求得到满足(

这显然是一个过于简化的观点,但希望它能让您知道如何做到这一点。

注意 - 除了上面指定的速率限制之外,您可能需要考虑建立适当的 API 速率限制机制,以防止您的服务受到它无法处理的请求的轰炸。这种类型的机制应该在API网关级别完成,而不是使用MongoDB自己做。例如,如果您使用 AWS 托管 API,它们将为您提供配置速率限制的方法。

最新更新