首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel试图使用节流阀时在Redis上失败了

Laravel试图使用节流阀时在Redis上失败了
EN

Stack Overflow用户
提问于 2018-10-04 13:21:46
回答 1查看 1.8K关注 0票数 1

最终目标

目的是让我的应用程序可能会向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个作业立即运行。

我想可能是密钥名不正确,但如果我更改以下内容:

代码语言:javascript
复制
    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);
    });
}

对此:

代码语言:javascript
复制
    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“类型的,而作业都在一个列表下。尽管如此,如果它不是这样工作,我们将如何节流一个队列,因为节流阀需要一个独特的钥匙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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”。

我希望这能帮到你!

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52647839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档