最终目标
目的是让我的应用程序可能会向Redis队列发送大量电子邮件(此位正在工作),然后Redis将处理这些邮件的时间限制为每一分钟只发送一组电子邮件。
对于这个例子,我有一个测试作业,它将时间附加到一个文件中,并且我试图每60秒将它节流一次。
到目前为止的故事..。
到目前为止,应用程序已经成功地将50个任务的测试量推送到Redis队列。我可以登录到Horizon,并在"processjob“队列中看到这50个作业。我还可以登录到redis-cli,并在列表键"queues:processjob“下看到50组。
我的问题是,一旦我试图打开节流阀,只运行一个作业,其余作业就会失败,出现以下错误:
Predis\Response\ServerException: ERR错误运行脚本(对f_29cc07bd431ccbf64637e5dcb60484560fdfa2da的调用):@user_script:10: WRONGTYPE对持有错误值的键的@user_script:10操作
如果我删除油门,所有的工程文件和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);
});
}对此:
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);
});
}那一切都很好。
我的想法..。
有一点告诉我,问题是redis键是" list“类型的,而作业都在一个列表下。尽管如此,如果它不是这样工作,我们将如何节流一个队列,因为节流阀需要一个独特的钥匙。
发布于 2018-10-09 07:09:22
对于任何有问题的人来说,他们正试图让这件事发挥作用,并得到和我一样的问题,这就是解决我的问题的原因:
过错
我以为Redis::throttle('queues:processjob')指的是您想要被勒死的队列。然而,在重新阅读了一些文档和代码测试之后,我意识到情况并非如此。
修正
Redis::throttle('queues:processjob')是指它自己的“保持”队列,因此必须是唯一的Redis密钥名。因此,将它更改为Redis::throttle('throttle:queues:processjob')对我来说很好。
工作
当我第一次研究这个问题时,我假设是Redis::throttle('this')控制了您指定的队列。在某种程度上,这是正确的,但如果工作是通过另一种方式创建的,它将无法工作。
Redis::throttle('this')实际上创建了一个新的“保持”队列,在该队列中,作业一直到您指定的条件满足为止。因此,在本例中,作业将进入队列“this”,当油门触发器被释放时,它们将被传递到它们的执行代码中指定的队列。在本例中,“队列:processjob”。
我希望这能帮到你!
https://stackoverflow.com/questions/52647839
复制相似问题