我正在尝试对我的ASP.NET Web项目执行一些非常简单的请求限制.目前我对针对DOS攻击的全局限制请求不感兴趣,但是想要人为地延迟对所有登录尝试的响应,只是为了使字典攻击更难做(或多或少像Jeff Atwood 这里概述的那样).
你会如何实现它?这样做的方式是 - 我想 - 简单地打电话
Thread.Sleep();
Run Code Online (Sandbox Code Playgroud)
在请求期间的某个地方.建议?:)
我有一个向自己发送消息的akka actor:
def receive = {
while (...) {
self ! "some message"
}
}
Run Code Online (Sandbox Code Playgroud)
我想使用Throttler来控制此actor发送给自己的消息流.
val throttler = system.actorOf(Props(new TimerBasedThrottler(15 msgsPer (1.minute))))
throttler ! SetTarget(Some(self))
Run Code Online (Sandbox Code Playgroud)
然后更改while循环以向throttler发送消息:
while (...) {
throttler ! "some message"
}
Run Code Online (Sandbox Code Playgroud)
问题是我不知道如何从actor内部访问"系统",以创建节流器.这该怎么做?有没有更好的方法?
我们目前正在使用RabbitMQ,其中一个持续超快的生产者与受限于有限资源的消费者(例如,慢速MySQL插入)配对.
我们不喜欢声明队列x-max-length,因为一旦达到限制,所有消息都将被删除或死信,我们不想丢失消息.
添加更多的消费者很容易,但他们都将受到一个共享资源的限制,因此无法使用.问题仍然存在:如何减缓生产者的速度?
当然,我们可以在Redis,memcached,MySQL或生产者读取的其他内容中添加一个流控制标志,如同对类似问题的回答所指出的那样,或者更好的是,生产者可以定期测试队列长度并限制自己,但是这些看起来像是我的黑客.
我主要质疑我是否有一个根本的误解.我原以为这是一个常见的场景,所以我想知道:
限制生产者的最佳做法是什么?这是如何用RabbitMQ完成的?或者你以完全不同的方式做到这一点?
假设生产者实际上知道如何通过正确的输入减慢自己的速度.例如,硬件传感器或硬件随机数生成器,可以根据需要生成任意数量的事件.
在我们特定的实际案例中,我们有一个用户可以用来添加消息的API.我们不想吞噬和丢弃消息,而是通过让我们的API在队列"满"时返回错误来应用反压,因此调用者/用户知道要退回,或者让API阻塞直到消费者赶上.我们不控制我们的用户,因此无论消费者的速度有多快,我都可以创建一个更快的生产者.
我希望有类似于TCP套接字的API,其中write()可以阻止,并且select()可以使用它来确定句柄是否可写.因此要么拥有RabbitMQ API块,要么在队列已满时返回错误.
我对油门和去抖功能的概念有点不确定.
我们去掉了一个应该在某个事件发生后调用的函数.它用于拖动,键盘等事件,目的是不会一直触发事件被触发,而是在事件系列完成时触发.通常在键入整个单词后,或者拖动或调整大小序列已结束.
我们限制了在发生一系列事件时应该触发的函数,但是当我们想控制它被调用的次数时.就像在拖动运动中一样,我们希望仅在距离的每x个像素中调用该函数,或者仅每隔100ms调用该函数,而不是每次触发该事件时都调用该函数.因此,在发生一系列事件时调用油门功能,只需更少次数.
这是对这些功能及其目的的正确看法吗?还有其他功能可以区分它们吗?
我们使用Lambda为通过新闻媒体网站访问的API(通过API网关)供电,接收波动但高负载的流量.我们开始体验限制,因此我们将并发限制提高到2000.但是,我们仍然每天多次经历限制.
奇怪的是,在CloudWatch指标中,当我们受到限制时,并发请求达到600或更低.请参阅此CloudWatch图表作为示例:
有谁之前经历过这个吗?为什么你认为这种情况发生了?我们对于它可以做些什么呢?
更多信息
此外,这里的图像还显示了同一时间段内的总调用次数和平均持续时间.很难知道是什么因果关系(由于节流导致持续时间上升,反之亦然,因为一些lambdas会调用其他lambda).请查看相应的轴,因为刻度差异很大.
关于 API 网关使用计划的 AWS 文档都暗示它们是使用/附加到 API 密钥创建的,但没有说明如果没有 API 密钥它将如何运行。我有一个未经授权的 API,我想对其应用限制。我可以创建使用计划,将其附加到资源,而不将 API 密钥与其关联吗?它会起作用吗?
上下文:我正在尝试使用 CloudFormation 的 Java SDK 来定义堆栈,但我无法弄清楚如何以编程方式指定特定于资源的节流阀。我还将接受一个答案,该答案告诉我如何在不使用控制台的情况下执行此操作。
throttling amazon-web-services aws-cloudformation aws-api-gateway aws-cdk
我有一个名为 的 dynamodb 表events。在此表中,我存储events用户执行的所有操作(page_view、product_view、add_cart、purchase)。
所以架构是
partition_key : <user_id>
attributes : {"vector" : <[list of events]>}
Run Code Online (Sandbox Code Playgroud)
最近我遇到了这样的问题
An error occurred (ThrottlingException) when calling the UpdateItem operation: Throughput exceeds the current capacity of your table or index.
DynamoDB is automatically scaling your table or index so please try again shortly.
If exceptions persist, check if you have a hot key: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-design.html
Run Code Online (Sandbox Code Playgroud)
我认为这与 aws-limits 问题有关,我达到了 awssupport team来增加限制。
增加限制后,我们再次遇到同样的问题。
谁能为此建议一个解决方案?
我认为RxJS应该完全适合压制多次按键点击2秒.但是,我正在努力实施.
var $button = $('#myButton').button();
$button
.toObservable("click")
//.Throttle(2000) // Wouldn't fire the first event instantly :-(
.Subscribe(function(){ alert('clicked'); });
Run Code Online (Sandbox Code Playgroud)
为方便起见,我已经创建了一个jsFiddle.你需要向下滚动这个小提琴,因为我只是粘贴Rx,因为我找不到CDN.
我有一个用Laravel 5.2创建的API.我正在使用油门限速.在我的路线文件中,我设置了以下内容..
Route::group(['middleware' => ['throttle:60,1'], 'prefix' => 'api/v1'], function() {
//
}
Run Code Online (Sandbox Code Playgroud)
据我了解Laravel限制,上面的脚本会将请求限制设置为每分钟60.我有一个应用程序查询路由,每10秒重复一次.因此,每分钟有6个请求,更令人满意的是上述节流.
问题是,我的查询工作,直到我执行60请求,无论时间和60请求后,它429 Too Many Requests用标头响应我Retry-After: 60.根据我的理解,X-RateLimit-Remaining应该每1分钟更新一次.但它似乎永远不会更新,直到它变为0.变为零后,等待60秒然后更新.
我在这做错了吗?
throttling ×10
.net ×1
actor ×1
akka ×1
api ×1
asp.net ×1
async-await ×1
aws-cdk ×1
aws-lambda ×1
debouncing ×1
function ×1
iis ×1
javascript ×1
laravel-5.2 ×1
rabbitmq ×1
rxjs ×1
scala ×1
security ×1