首页 > 解决方案 > 如何对每个用户进行速率限制?

问题描述

我有一个具有基于信用的使用系统的应用程序。但是,在我当前的结构中,如果用户在足够小的窗口中发出 2 个请求,他可以通过这两个请求,这会导致系统故障和用户的信用值负值,因为当第二个请求应该时,他的信用会减少两次'没有被允许。

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

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

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

标签: node.jsexpressfirebase-realtime-databasegoogle-cloud-functionsrate-limiting

解决方案


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

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


推荐阅读