【发布时间】:2018-10-04 13:21:46
【问题描述】:
最终目标
我的应用程序的目标是向 Redis 队列发送潜在的大量电子邮件(该位正在工作),然后 Redis 将这些邮件的处理限制为每选定的分钟数只处理一组电子邮件。
对于本示例,我有一个将时间附加到文件的测试作业,我试图将其限制为每 60 秒一次。
到目前为止的故事......
到目前为止,我的应用程序已成功将 50 个测试作业量推送到 Redis 队列。我可以登录到 Horizon 并在“processjob”队列中看到这 50 个作业。我也可以登录redis-cli,在list键“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/predis 中持有错误类型值的键进行操作/src/Client.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);
});
}
到这里:
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 键的类型是“列表”,并且作业都在一个列表下。话虽如此,如果它不能以这种方式工作,我们将如何限制队列,因为限制需要唯一的键。
【问题讨论】:
标签: laravel redis laravel-5.5 throttling