我有一个 Vue 2 应用程序,它使用对象数组来支持vue-multiselect提供的搜索/多选小部件。
我已经查看了关于去抖动调用的Vue 1 -> 2 迁移指南,但是他们给出的示例没有将参数从 DOM 元素传播到业务逻辑。
现在,每次击键时 select 都会触发更改事件,但我想限制它(例如,使用 lodash#throttle),这样我就不会在他们打字时每隔几毫秒就调用我的 API。
import {mapGetters} from 'vuex';
import { throttle } from 'lodash';
import Multiselect from 'vue-multiselect'
export default {
components: {
Multiselect
},
data() {
return {
selectedWork: {},
works: [],
isLoading: false
}
},
computed: {
...mapGetters(['worksList']),
},
methods: {
getWorksAsync: throttle((term) => {
// the plan is to replace this with an API call
this.works = this.worksList.filter(work => titleMatches(work, term));
}, …Run Code Online (Sandbox Code Playgroud) 我花了几天时间,但找不到在 RxJS 中进行“独特节流”的方法。
\n\n假设每个事件在 4 个破折号内完成,“不同的节流阀”将执行如下:
\n\n-\xe2\x91\xa0-\xe2\x91\xa1-\xe2\x91\xa0---------\xe2\x91\xa0-----|->
\n\n[独特的油门]
\n\n-\xe2\x91\xa0-\xe2\x91\xa1-------------\xe2\x91\xa0-----|->
\n\n如何使用现有的 RxJS 运算符来构建“独特的节流阀”?
\n我现在读了很多帖子,仍然无法充分解决我的问题:
如果运行带有 Spring Rest 后端的 Tomcat Web 服务器,则有应该必须是一种限制每秒/分钟/...可能的请求的方法,例如基于请求者的 IP。到目前为止,我的调查得出了以下可能性:
现在我不喜欢第一个解决方案,因为请求已经到达应用程序本身,而第二个解决方案构建了一个附加层,我真的不相信这对于这样一个基本问题是必要的。
所以我的问题是,我在这里缺少哪些方法和解决方案?我读过一些有关 tomcat Valve semaphore 的内容,但它似乎只是限制了请求的总体速率。在 8443 端口上使用一些基本功能(如 iptables 或fail2ban)进行过滤并在给定时间范围内简单地删除同一 ip 的请求是否是最有效/可能的?
我学习了 ReactJS 和 NextJS,但在 NextJS 中实现速率限制/节流时遇到了困难。我希望限制用户在一段时间内访问某些请求的次数。
我正在尝试启用 API 网关限制,但它没有按预期工作。
我将默认方法限制速率设置为每秒 1 个请求,并将突发设置为 1 个请求。
然后,我在代码中创建了一个循环,向我的 API 端点同时发出 10 个请求。
for (let i=0; i<10; i++) {
axios.get(url);
}
Run Code Online (Sandbox Code Playgroud)
预期结果是:
但实际结果却恰恰相反:
我重复了该过程,但同时发出 20 个请求,结果是:
在该 API 方法的 CloudWatch 日志中,我发现了不同的日志流,每个日志流只有几毫秒的差异。
如果我将速率设置为每秒 0 个请求并将突发设置为 0 个请求,则限制将起作用并且所有请求都会受到限制。但是当我将 Rate 和 Bust 设置为 1 时,它无法按预期工作。
为什么会发生这种情况?我需要将 API 限制为每秒仅 1 个请求。
我正在开发一个 Django/DRF 应用程序,并且正在尝试实现一个 API 限制,该限制对于失败的登录尝试会产生越来越长的延迟。
例如。在 3 次失败尝试后将用户锁定 1 分钟,在 6 次失败后锁定用户 10 分钟,在 9 次失败后锁定用户 30 分钟等,类似于手机的操作以及一般登录页面的常见操作。我惊讶地发现,考虑到登录场景的普遍性,Django 或 DRF 中似乎没有内置渐进式节流阀......
Django Rest FrameworkAPIView提供了一个throttle_classes字段和一个get_throttles()方法,并且它有一些用于执行固定速率油门延迟的通用油门。我可以通过添加限制列表来模拟渐进速率,如下所示:
def get_throttles(self):
return [
MyCustomThrottle('3/m'),
MyCustomThrottle('6/10m'),
MyCustomThrottle('9/30m'),
]
Run Code Online (Sandbox Code Playgroud)
然后添加一个自定义get_cache_key()方法,MyCustomThrottle该方法返回一个不会与列表中其他节流阀冲突的唯一键。
这几乎是有效的——它可以阻止刚刚踩油门的机器人——但是,它有几个问题:
如果/当用户成功登录时,DRF 限制没有一种简单的方法可以清除限制列表。我通过手动修改 DRF 节流使用的缓存来解决这个问题,但这并不理想......
DRF 节流阀在请求循环中的某个点触发,并且该点可能会也可能不会发生身份验证 - 因此节流阀可能不知道传入的凭据是否良好:
答:如果通过APIView.authentication_classes现场进行身份验证,则身份验证发生在节流阀之前,然后节流阀可以知道身份验证是否成功并可以采取相应的行动。这样做的缺点是每个机器人请求都会导致数据库命中。
B. 如果在视图代码中进行身份验证,则身份验证会在触发限制后发生。缺点是节流器不知道传入的信用是否良好,但优点是机器人在数据库受到攻击之前被阻止。
我们的应用程序正在执行选项 B,因为我们也在实施 2FA(也许有一种方法可以通过 2FA 进行authentication_classes,但这就是今天的情况......)并且因为我们希望以最少的 DB 攻击来阻止机器人。 选项 B 有点排除了 DRF 限制,因为边缘情况会导致糟糕/令人困惑的用户体验。
我有一个基于Perl的CGI /快速CGI Web服务,并希望通过IP地址对客户端进行速率限制,以阻止侵略性客户端造成太多工作.
我查看了一些代码并在CPAN中找到了Algorithm :: TokenBucket,但这是针对客户端请求的; 它没有持久性,没有每用户配置,因此对服务器端速率限制没有用.
我正在寻找已经存在的东西的建议,否则我需要基于一些简单的持久性来自行推送,例如绑定到DB_File每IP地址和一些执行令牌管理的批处理作业.
我有以下代码返回我的WCF服务的实例ServiceClient:
var readerQuotas = new XmlDictionaryReaderQuotas()
{
MaxDepth = 6000000,
MaxStringContentLength = 6000000,
MaxArrayLength = 6000000,
MaxBytesPerRead = 6000000,
MaxNameTableCharCount = 6000000
};
var throttlingBehaviour = new ServiceThrottlingBehavior(){MaxConcurrentCalls=500,MaxConcurrentInstances=500,MaxConcurrentSessions = 500};
binding = new WSHttpBinding(SecurityMode.None) {MaxReceivedMessageSize = 6000000, ReaderQuotas = readerQuotas};
dualBinding = new WSDualHttpBinding(WSDualHttpSecurityMode.None)
{MaxReceivedMessageSize = 6000000, ReaderQuotas = readerQuotas};
endpointAddress = new EndpointAddress("http://localhost:28666/DBInteractionGateway.svc");
return new MusicRepo_DBAccess_ServiceClient(new InstanceContext(instanceContext), dualBinding, endpointAddress);
Run Code Online (Sandbox Code Playgroud)
最近我遇到了超时问题,所以我决定添加一个限制行为,比如:
var throttlingBehaviour = new ServiceThrottlingBehavior () {
MaxConcurrentCalls=500,
MaxConcurrentInstances=500,
MaxConcurrentSessions = 500
};
Run Code Online (Sandbox Code Playgroud)
我的问题是,在上面的代码中我应该将它添加throttlingBehaviour到我的 …
背影故事
不久前,我被问到是否可以在内部实施大规模电子邮件解决方案,以便我们能够更好地控制敏感信息.我提出了一个两步计划:在Excel/VBA/CDO中开发原型以便用户熟悉,然后分阶段.Net/SQL服务器解决方案以提高速度和稳健性.
什么改变了
进入第二阶段的3个月,管理层决定继续将电子邮件营销外包给另一家公司,这很好.第一个问题是管理层没有对公司采取行动,所以我仍然没有义务让当前的原型工作.
仍然,原型工作,或至少它的确如此.第二个问题出现在我们的Exchange 2003中继服务器与Exchange 2010交换时.事实证明,默认情况下更多的"安全"功能就像限制策略一样被转换,我一直在帮助系统管理员解决服务器配置的问题.发生的事情是,发送+100电子邮件后,服务器开始拒绝发送请求,并出现以下错误:
The message could not be sent to the SMTP server. The transport error code is 0x800ccc67.
The server response was 421 4.3.2 The maximum number of concurrent connections has exceeded a limit, closing transmission channel
Run Code Online (Sandbox Code Playgroud)
不幸的是,我们只能在Marketing发送内容时测试服务器配置,大约每月一次.
下一步是什么?
我正在查看Excel的VBA定时器功能,以帮助限制我的主循环泵,以帮助限制发送请求.这里的第三个问题是,从我从阅读中理解的是,我能得到的最佳精度是1秒钟的计时器.与我们发送的5封电子邮件/秒相反,每秒1封电子邮件会相当长(大约4倍-5倍).这使得3小时的流程变成了一整天的流程,超过了工作人员的可用时间.我想我可以通过每秒发送5封电子邮件来反转速率,但是如果定时器具有更高的精度,则产生更多的突发影响而不是稳定速率.在我看来,这会创建一个不太受控制的过程,我不确定服务器将如何处理突发而不是稳定的速率. 我有什么选择?
我有这样的代码:
var originalFunction = function() {
return 'some value';
};
var debouncedFunction = _.debounce(originalFunction, 3000);
console.log('debouncedFunction() result: ', debouncedFunction());
console.log('originalFunction() result: ', originalFunction());
Run Code Online (Sandbox Code Playgroud)
控制台的结果是:
debouncedFunction() result: undefined
originalFunction() result: some value
Run Code Online (Sandbox Code Playgroud)
如您所见,去抖动功能不会返回任何内容.据我所知,它是由去抖动功能中的内部定时器引起的,但它是否存在?
throttling ×10
javascript ×2
aws-lambda ×1
c# ×1
cgi ×1
debouncing ×1
django ×1
email ×1
jquery ×1
next.js ×1
node.js ×1
perl ×1
reactjs ×1
rxjs ×1
server ×1
spring ×1
tomcat ×1
vba ×1
vue.js ×1
vuejs2 ×1
wcf ×1
web-services ×1