我知道客户端_underscore.js可用于限制点击率,但是如何限制服务器端的呼叫?我想过使用相同的模式但不幸的是_throttle似乎不允许区分Meteor.userId()。
Meteor.methods({
doSomething: function(arg1, arg2){
// how can you throttle this without affecting ALL users
}
);
答案 0 :(得分:6)
这是一个我已经粗暴对待的程序包 - 但尚未提交给Atmosphere(等到我熟悉最小的并且为它编写单元测试)。
https://github.com/zeroasterisk/Meteor-Throttle
随意使用它,扩展,修复和贡献(鼓励提取请求)
这个概念很简单,它只在服务器上运行(应该只运行)。
首先,你需要为你想要扼杀的东西拿出一个独特的钥匙......
例如:Meteor.userId() + 'my-function-name' + 'whatever'
这个系统使用一个新的Collection' throttle&'和一些辅助方法来:
check
,set
和purge
条记录。还有一个助手checkThenSet
方法实际上是最常见的模式,检查我们是否可以做某事,
并设定了我们所做的记录。
(使用案例)如果您的应用发送电子邮件,则不希望发送相同的电子邮件 并且一次又一次,即使用户触发了它。
// on server
if (!Throttle.checkThenSet(key, allowedCount, expireInSec)) {
throw new Meteor.Error(500, 'You may only send ' + allowedCount + ' emails at a time, wait a while and try again');
}
....
checkThenSet(key, allowedCount, expireInSec)
检查密钥,如果通过则设置密钥以供将来检查check(key, allowedCount)
检查一个密钥,如果存在少于allowedCount
个(未到期)记录,则传递set(key, expireInSec)
设置密钥记录,它将在expireInSec
秒后过期,例如:60
=未来1分钟purge()
使所有不再在时间范围内的记录失效(每次检查时自动调用)throttle(key, allowedCount, expireInSec)
- > Throttle.checkThenSet()
throttle-check(key, allowedCount)
- > Throttle.check()
throttle-set(key, expireInSec)
- > Throttle.set()
答案 1 :(得分:3)
目前在流星中没有内置支持,但它在路线图上https://trello.com/c/SYcbkS3q/18-dos-hardening-rate-limiting
理论上你可以使用Throttling method calls to M requests in N seconds中的一些选项,但你必须推出自己的解决方案