Laravel 如何实现满足条件执行,否则整个队列都不执行呐?

我的需求

我需要做一个排队系统,当服务器资源可用时,用户请求通过,否则进入队列排队直到服务器有新的可用资源。我后台会存在一个计划任务来获取服务器资源是否可用。

PS:我查看了laravel队列章节的文档,没有发现可以触发执行job的办法,或者是我的队列job一直执行,只有前面job成功才会执行后续job的办法。希望可以得到帮助。感激不尽。

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 6

那如果前面的队列一直执行不成功,那就整个队列都不执行了?

3年前 评论
Alan_Tian (楼主) 3年前

两种方案:

  1. 开一个特定的队列专门处理此任务,入队列时检查队列是否为空,为空则入队列,否则不入。基于这种方案的时候记得加锁
  2. 队列任务记录前一个任务的唯一标识,每个任务完成后再数据库中或者缓存中设置任务已完成状态,处理每个任务前检查是否有前一个任务的处理完成状态,有就处理,否则退回队列。同样有并发问题要注意

另外如果处理的顺序不重要的话,考虑后台任务在redis当中设置可用资源数,如:sysres => 5, 处理用户任务的时候将redis的资源数desc,当资源数量不够时阻塞或者返回失败,这个就看你自己了。

3年前 评论

问这个问题时进入思维误区了,现在找到办法了,在执行第一个job时如果没有资源就挂机等待,直到有资源后第一个任务结束,再执行后续任务即可。大致代码如下图

file PS: 需要注意你的任务执行不能有超时限制

3年前 评论

@我有另外一个问题。如果这个资源是用户级别的,该如何进行操作呢?
比如队列中现在有A1、A2、A3、B1、B2,这5个任务。

根据现在的资源配额,A无法执行任务,B可以执行任务,如何让队列跳过A的任务,去执行到B的任务。
我现在的做法是在先运行,然后在任务里进行判断,有运行资源就运行,没有运行资源再塞进队列,不足是会破坏顺序。

3年前 评论
自由与温暖是遥不可及的梦想

走 事件

3年前 评论

用 任务调度 是不是比较好点 ? 任务调度 逻辑判断是否有资源空闲。 使用 队列 --once 这个参数 只调用 有空闲资源的队列一次

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!