我正在使用 Laravel Horizon 和 Redis,我正在尝试限制它。我使用的外部 API 的速率限制为每分钟 100 个请求。我需要提出大约 700 个请求。我进行了设置,以便添加到队列中的每个作业仅在作业本身中执行一个 API 调用。因此,如果我限制队列,我应该能够保持在限制范围内。由于某种原因,没有发生限制,而是超出了队列(当然,这会触发许多 API 错误)。然而,节流阀在本地工作,但不在我的服务器上工作。
我最初试图根据 Laravel 的队列文档进行限制,但只能让它在本地工作,所以我转而尝试Github 上的laravel-queue-rate-limit包。根据自述文件,我将以下内容添加到我的queue.php配置文件中:
'rateLimits' => [
'default' => [ // queue name
'allows' => 75, // 75 job
'every' => 60 // per 60 seconds
]
],
Run Code Online (Sandbox Code Playgroud)
由于某种原因,当我在本地 Ubuntu 环境中运行它时,限制可以正常工作,但它在我的服务器(也是 Ubuntu)上不起作用。在服务器上,它只是吹过队列,就好像没有适当的节流一样。
我是否做错了什么,或者可能有更好的方法来处理速率受限的外部 API?
编辑1:
配置/horizon.php
'environments' => [
'production' => [
'supervisor-1' => [
'connection' => 'redis',
'queue' => ['default'],
'balance' => 'simple',
'processes' => 3,
'tries' => 100,
], …Run Code Online (Sandbox Code Playgroud) Laravel 8 速率限制器支持每分钟速率限制。我需要设置每天的速率限制。有什么解决方法吗?
更新:
Illuminate\Cache\RateLimiting\Limit类有perDay方法。
我知道SF中存在这类问题,但它们非常具体,我需要一个通用的建议.我需要一个功能来上传用户文件,其大小可能超过1 GB.此功能将成为应用程序中现有文件上载功能的附加组件,可满足较小的文件需求.现在,这里有一些选择
请建议.
此外,我要确保此上传过程不会妨碍其他用户的任务,换句话说,不会占用其他用户的黑白.任何可以在n/w级别完成的机制来限制这些过程?
最终,客户希望将FTP作为一种选择.但我认为以编程方式处理文件的答案也很酷.
我通过TCP套接字连接客户端/服务器,服务器尽可能快地写入客户端.
查看我的网络活动,生产客户端以大约2.5 Mb/s的速度接收数据.
我写的一个新的轻量级客户端只是读取和测试速率,速率约为5.0Mb/s(这可能是服务器可以传输的最大速度).
我想知道这里的费率是什么,因为客户端没有向服务器发送数据来告诉它任何速率限制.
我知道我可以使用tc和netem来做
tc qdisc add dev eth0 root netem loss 50%
Run Code Online (Sandbox Code Playgroud)
这将在所有eth0流量中丢弃50%的数据包.但是,我想指定一个协议(UDP,TCP等),因此只会删除此协议的数据包.
我是Reactive Extensions的新手.我有对象集合并为每个对象调用方法,并返回布尔值.通过使用每个循环并调用方法,而不是循环遍历每个循环,是否有一种方法在响应式扩展中同时调用(fork和join)给定数量的对象的方法(一次是ex 5)并且在第一次完成之后,第六个应该调用方法,它应该继续,直到所有对象都完成.
感谢您的回复.
我在我的应用程序中实现了一些请求限制.它基于使用MemoryCache和根据限制到期的项目.基本上我尝试检索一个缓存项目,如果它不在那里我继续发出请求,如果是他们我检查最后一个请求和锻炼下一个可用时间我可以提出请求.我的问题在于我必须等待提出请求.
//This is a shortened version of what im doing, but the includes the required code
public void ThrottleRequest(string webservice)
{
if (cache.TryGet(webservice))
{
var timeToWait = GetTimeToWaitFromSomewhere();
Wait(timeToWait);
}
}
public async void Wait(TimeSpan timeToWait)
{
await Task.Delay(timeToWait); //This doesnt work
Thread.Sleep(timeToWait); //This works
}
Run Code Online (Sandbox Code Playgroud)
问题在于等待方法.如果我使用thread.sleep数字匹配并且请求被正确限制(即每秒1个请求)但我永远不想在生产环境中使用它.那么在这里异步等待的正确方法是什么?我滥用API还是什么?
我在Azure上有一个文档数据库数据库。当我存档用户记录及其所有数据时,我会遇到一个特别繁重的查询。
我正在执行S1计划,并且会遇到一个异常,表明我已达到RU / s的极限。S1计划有250个。
我决定切换到“标准”计划,该计划可让您设置RU / s并为此付费。
我将其设置为500 RU / s。
我进行了相同的查询,然后回头查看了监视图表。
在我进行此最新查询测试时,它说我做了226个请求,其中有10个受到限制。
这是为什么?我将其设置为500 RU / s。顺便说一下,查询失败了。
我有限制调用100/s的情况.
我正在考虑使用Google Guava RateLimiter.我测试了这样: -
int cps = 100;
RateLimiter limiter = RateLimiter.create(cps);
for(int i=0;i<200;i++) {
limiter.acquire();
System.out.print("\rNumber of records processed = " + i+1);
}
Run Code Online (Sandbox Code Playgroud)
但是代码没有停在100条记录上,让1秒完成.难道我做错了什么?
throttling ×10
java ×2
laravel ×2
php ×2
.net ×1
asynchronous ×1
azure ×1
c# ×1
file-upload ×1
guava ×1
large-files ×1
linux ×1
login ×1
networking ×1
redis ×1
sockets ×1
task-queue ×1
throughput ×1
udp ×1