Pet*_*y87 1 throttling redis laravel laravel-5.5
目的是让我的应用程序向 Redis 队列发送潜在的大量电子邮件(该位正在工作),然后 Redis 将这些处理限制为每选定的分钟数只发送一定数量的电子邮件。
对于此示例,我有一个将时间附加到文件的测试作业,我试图将其限制为每 60 秒一次。
到目前为止,我有应用程序成功地将 50 个作业的测试量推送到 Redis 队列。我可以登录到 Horizon 并在“processjob”队列中看到这 50 个作业。我也可以登录redis-cli,在列表键“queues:processjob”下看到50个集合。
我的问题是,一旦我尝试打开油门,只有 1 个作业运行,其余作业失败并出现以下错误:
Predis\Response\ServerException: ERR Error running script (call to f_29cc07bd431ccbf64637e5dcb60484560fdfa2da): @user_script:10: WRONGTYPE 对 /var/www/html/smhub/vendor/predis/ 中持有错误类型值的键的操作客户端.php:370
如果我取消节流阀,所有工作文件和 5 个作业都会立即运行。
我想也许这是不正确的键名,但如果我更改以下内容:
public function handle()
{
//
Redis::throttle('queues:processjob')->allow(1)->every(60)->then(function(){
Storage::disk('local')->append('testFile.txt',date("Y-m-d H:i:s"));
}, function (){
return $this->release(10);
});
}
Run Code Online (Sandbox Code Playgroud)
对此:
public function handle()
{
//
Redis::funnel('queues:processjob')->limit(1)->then(function(){
Storage::disk('local')->append('testFile.txt',date("Y-m-d H:i:s"));
}, function (){
return $this->release(10);
});
}
Run Code Online (Sandbox Code Playgroud)
然后一切正常。
有人告诉我,问题在于 redis 键的类型是“列表”,并且作业都在一个列表下。话虽如此,如果它不能以这种方式工作,我们将如何节流队列,因为节流需要一个唯一的键。
对于在尝试使其正常工作时遇到问题并且遇到与我相同的问题的其他任何人,这就是解决我的问题的方法:
我认为这Redis::throttle('queues:processjob')是指您想要限制的队列。然而,在重新阅读文档和代码测试后,我意识到情况并非如此。
Redis::throttle('queues:processjob')旨在指向它自己的“持有”队列,因此必须是唯一的 Redis 键名。因此,将其更改Redis::throttle('throttle:queues:processjob')为对我来说效果很好。
当我第一次看到这个时,我认为这会Redis::throttle('this')限制您指定的队列。在某种程度上,这是正确的,但如果工作是通过其他方式创建的,它将不起作用。
Redis::throttle('this')实际上会创建一个新的“保留”队列,直到满足您指定的条件为止。因此,在此示例中,作业将进入队列“this”,当油门触发器被释放时,它们将被传递到其执行代码中指定的队列。在这种情况下,'queues:processjob'。
我希望这有帮助!
| 归档时间: |
|
| 查看次数: |
1283 次 |
| 最近记录: |