node.js - 如何对每个用户进行速率限制?
问题描述
我有一个具有基于信用的使用系统的应用程序。但是,在我当前的结构中,如果用户在足够小的窗口中发出 2 个请求,他可以通过这两个请求,这会导致系统故障和用户的信用值负值,因为当第二个请求应该时,他的信用会减少两次'没有被允许。
我想确保单个用户在给定时间只能运行一个请求,我尝试使用express-rate-limit但这不适合我的用例,因为这些请求是由我拥有的谷歌云功能发出的设置而不是用户自己。
但是,我有特定的用户 id 来识别这些请求,因此我可以拥有特定于用户 id 的队列来一一处理单个用户的请求。
这是解决信用使用问题的适当且可扩展的设计,还是有更好的选择?
解决方案
您将需要对您使用的任何底层数据存储使用原子操作。由于您还没有说那是什么,因此无法就如何进行提供具体建议。大多数数据库都提供了一种使用“事务”的方法,该“事务”只有在满足某些条件时才允许更新成功。您将希望使用这些事务之一来确定客户端是否应该能够继续进行更新。
确实没有简单的方法可以让 Cloud Functions以一种可扩展的方式限制每个用户的函数调用率。这实际上是关于允许太多并发请求的底层存储机制。如果您不必扩大用户数量,您可以使用Cloud Tasks为每个用户实现一个队列,但我认为这并不是最好的解决方案。
推荐阅读
- javascript - 有向图d3js中的堆叠节点
- c# - 从 DLL 访问数据
- java - 从浏览器发送后 Http Request-Header 更改
- javascript - 在 Recharts 中,悬停时,相交线应停止在折线图上的相应值处(不要到顶部包装器的最末端)
- javascript - Google Map Javascript API 我想隐藏除银行以外的所有内容
- python - 如何让乌龟跟随 Python 中的鼠标光标?
- android - 当通过导航组件的深层链接打开片段而不是返回到开始目标片段时,在返回按钮上关闭应用程序
- django - Django在打开记录后设置布尔值
- python - 使用 pyqt 将绘图添加到 GraphicsLayoutWidget
- swift - 公共函数 addObserver
(主题:T.Type,观察者:M:T){}