我的应用程序发出Web服务请求; 提供商将处理的请求的最大速率,因此我需要限制它们.
当应用程序在单个服务器上运行时,我曾经在应用程序级别执行此操作:跟踪到目前为止已经发出了多少请求的对象,并等待当前请求是否超过允许的最大负载.
现在,我们正在从单个服务器迁移到群集,因此有两个应用程序副本正在运行.
这是一个JavaEE 5环境.限制应用程序发出的请求的最佳方法是什么?
一个函数如何限制其调用?如果过于频繁,则不应丢弃这些调用,而是在时间上排队并间隔开,间隔为X毫秒.我看过油门和去抖动,但他们放弃了通话而不是将它们排队等待将来运行.
有没有比process()X毫秒间隔设置方法的队列更好的解决方案?JS框架中是否有这样的标准实现?到目前为止我看过underscore.js - 没什么.
我有一个list的awaitables,我想传递给asyncio.AbstractEventLoop,但我需要节流请求第三方API.
我想避免一些等待传递future到循环的东西,因为在此期间我阻止我的循环等待.我有什么选择?Semaphores并ThreadPools会限制多少并发运行,但是这不是我的问题.我需要将请求限制为100 /秒,但完成请求所需的时间并不重要.
这是一个使用标准库的非常简洁(非)工作示例,它演示了这个问题.这应该以100 /秒的速度节流,但节流速度为116.651 /秒.在asyncio中限制异步请求调度的最佳方法是什么?
工作代码:
import asyncio
from threading import Lock
class PTBNL:
def __init__(self):
self._req_id_seq = 0
self._futures = {}
self._results = {}
self.token_bucket = TokenBucket()
self.token_bucket.set_rate(100)
def run(self, *awaitables):
loop = asyncio.get_event_loop()
if not awaitables:
loop.run_forever()
elif len(awaitables) == 1:
return loop.run_until_complete(*awaitables)
else:
future = asyncio.gather(*awaitables)
return loop.run_until_complete(future)
def sleep(self, secs) -> True:
self.run(asyncio.sleep(secs))
return True
def get_req_id(self) -> int:
new_id = …Run Code Online (Sandbox Code Playgroud) 我正在比较令牌桶和固定窗口速率限制算法,但对这两种算法中的流量突发有点困惑。
假设我想将流量限制为 10 个请求/分钟。
令牌桶中以每分钟10个令牌的速度添加令牌。
Time Requests AvailableTokens
10:00:00 0 10 (added 10 tokens)
10:00:58 10 0
10:01:00 0 10 (added 10 tokens)
10:01:01 10 0
Run Code Online (Sandbox Code Playgroud)
现在,如果我们在时间戳 10:01:01 看到,最后一分钟允许 20 个请求,超过了我们的限制。
类似地,使用固定窗口算法。窗口大小:1 分钟。
Window RequestCount IncomingRequests
10:00:00 10 10 req at 10:00:58
10:01:00 10 10 req at 10:01:01
Run Code Online (Sandbox Code Playgroud)
类似的问题也在这里。
这两种算法都遇到这个问题吗,还是我的理解存在差距?
我想为一个按钮添加一个debounce,但是我希望每次用户点击按钮时执行一些操作,但只有在用户点击按钮后5秒后才执行,然后执行SQL更新.通常,节流似乎直接应用于监听器.在这里,我想要在每次单击按钮时执行一些操作,然后在合理的等待期后进行更新.
我不知道如何在这种情况下使用该功能......
参考:http://code.google.com/p/jquery-debounce/
$('#myButton').click(function() {
// do a date calculation
// show user changes to screen
// wait until user has has stopped clicking the
// button for 5 seconds, then update file with "process" function.
});
function process(){
// update database table
}
Run Code Online (Sandbox Code Playgroud)
$('input').bind('keyup blur', $.debounce(process, 5000));
Run Code Online (Sandbox Code Playgroud) 场景:
我正在构建一个UI应用程序,每隔几毫秒从后端服务获取通知.收到新通知后,我想尽快更新用户界面.
因为我可以在很短的时间内收到大量的通知,而且我总是只关心最新的事件,所以我使用了Reactive Extensions框架的Throttle()方法.这允许我忽略紧跟新通知的通知事件,因此我的UI保持响应.
问题:
假设我将通知事件的事件流限制为50ms,并且后端每隔10ms发送一次通知,Thottle()方法将永远不会返回事件,因为它会一次又一次地重置其滑动窗口.在这里,我需要一些额外的行为来指定类似超时的东西,这样我就可以每秒至少检索一个事件,如果有这么高的事件吞吐量.如何使用Reactive Extensions执行此操作?
我正在设置一个概念证明来限制终端(客户端)的入口流量:
eth0 -> ifb0 -> htb -> filter by ip -> htb rate -> fq_codel+ecn
Run Code Online (Sandbox Code Playgroud)
我有两个源ips用于特定程序我想要限制.有问题的程序打开了一堆tcp连接(下载,因此进入限制),我想限制它使用(完成)的总入口带宽,并在连接到相同IP地址之间进行公平调度(这个问题).
最后有1个带速率的桶和1个fq_codel实例.
我有它的工作,但我有一些问题:
每个互联网研究流程id是"5元组的哈希",问题是,数据包的哪些元素是5元组的一部分?是否包括源端口和目标端口?
我有一个带有Slider小部件的Bokeh应用程序,它使用Slider.on_change回调来更新我的图形.但是,滑块更新比我的回调函数可以处理得快得多,因此我需要一种方法来限制传入的更改请求.问题非常突出,因为滑块在滑动期间调用回调,而只有最后一个滑块值(当用户释放鼠标时)是有意义的.
我怎么能解决这个问题?
创建新的Azure IOT Hub时,系统会询问您需要多少个设备到云分区.您可以为标准层选择2-32个分区.
我了解SKU和单位数决定了您可以发送到IOT Hub的每日最大消息配额.并且建议将您的设备分成多个IOT集线器以平滑流量突发.但是,设备到云分区需要澄清.
1 >>单个IOT集线器下的设备到云分区的目的是什么?
2 >>我们如何利用那些IOT Hub设备到云分区?
谢谢.
我正在尝试对我的ASP.NET Web项目执行一些非常简单的请求限制.目前我对针对DOS攻击的全局限制请求不感兴趣,但是想要人为地延迟对所有登录尝试的响应,只是为了使字典攻击更难做(或多或少像Jeff Atwood 这里概述的那样).
你会如何实现它?这样做的方式是 - 我想 - 简单地打电话
Thread.Sleep();
Run Code Online (Sandbox Code Playgroud)
在请求期间的某个地方.建议?:)
throttling ×10
javascript ×2
python ×2
algorithm ×1
asp.net ×1
azure ×1
bokeh ×1
c# ×1
debouncing ×1
iis ×1
iot ×1
java ×1
java-ee ×1
jquery ×1
linux ×1
networking ×1
python-3.x ×1
routing ×1
security ×1
sharding ×1
task-queue ×1