如何对每个用户进行速率限制?

How to rate limit per user?

我有一个应用程序具有基于信用的使用系统。然而,根据我当前的结构,如果用户在足够小的 window 内发出 2 个请求,他可以同时获得这两个请求,这会导致系统出现故障,并且用户的信用值会为负值,因为他的信用值会在以下情况下减少两次第二个请求不应该被允许。

我想确保单个用户在给定时间只能有一个请求 运行,我尝试使用 express-rate-limit 但这不适合我的用例,因为这些请求是由我设置的 google 云功能而不是用户本人发出的。

但是,我有特定的用户 ID 来标识这些请求,因此我可以有特定于用户 ID 的队列来逐一处理单个用户的请求。

这是解决信用使用问题的适当且可扩展的设计吗?还是有更好的选择?

您将需要对您使用的任何底层数据存储使用原子操作。由于您还没有说那是什么,因此无法就如何进行提供具体建议。大多数数据库都提供了一种使用 "transaction" 的方法,只有满足特定条件时更新才会成功。您将希望使用这些事务之一来确定客户端是否应该能够继续更新。

确实没有简单的方法可以让 Cloud Functions 限制每个用户的函数调用率,以一种可以很好扩展的方式。这实际上是关于允许过多并发请求的底层存储机制。如果您不必增加用户数量,您可以使用 Cloud Tasks 为每个用户实现一个队列,但我认为这并不是最好的解决方案。