问答 / 1 / 6 / 创建于 5年前
我需要做一个排队系统,当服务器资源可用时,用户请求通过,否则进入队列排队直到服务器有新的可用资源。我后台会存在一个计划任务来获取服务器资源是否可用。
队列排队
计划任务
PS:我查看了laravel队列章节的文档,没有发现可以触发执行job的办法,或者是我的队列job一直执行,只有前面job成功才会执行后续job的办法。希望可以得到帮助。感激不尽。
那如果前面的队列一直执行不成功,那就整个队列都不执行了?
两种方案:
另外如果处理的顺序不重要的话,考虑后台任务在redis当中设置可用资源数,如:sysres => 5, 处理用户任务的时候将redis的资源数desc,当资源数量不够时阻塞或者返回失败,这个就看你自己了。
问这个问题时进入思维误区了,现在找到办法了,在执行第一个job时如果没有资源就挂机等待,直到有资源后第一个任务结束,再执行后续任务即可。大致代码如下图
PS: 需要注意你的任务执行不能有超时限制
超时限制
@我有另外一个问题。如果这个资源是用户级别的,该如何进行操作呢?比如队列中现在有A1、A2、A3、B1、B2,这5个任务。
根据现在的资源配额,A无法执行任务,B可以执行任务,如何让队列跳过A的任务,去执行到B的任务。我现在的做法是在先运行,然后在任务里进行判断,有运行资源就运行,没有运行资源再塞进队列,不足是会破坏顺序。
走 事件
用 任务调度 是不是比较好点 ? 任务调度 逻辑判断是否有资源空闲。 使用 队列 --once 这个参数 只调用 有空闲资源的队列一次
我要举报该,理由是:
那如果前面的队列一直执行不成功,那就整个队列都不执行了?
两种方案:
另外如果处理的顺序不重要的话,考虑后台任务在redis当中设置可用资源数,如:sysres => 5, 处理用户任务的时候将redis的资源数desc,当资源数量不够时阻塞或者返回失败,这个就看你自己了。
问这个问题时进入思维误区了,现在找到办法了,在执行第一个job时如果没有资源就挂机等待,直到有资源后第一个任务结束,再执行后续任务即可。大致代码如下图
超时限制@我有另外一个问题。如果这个资源是用户级别的,该如何进行操作呢?
比如队列中现在有A1、A2、A3、B1、B2,这5个任务。
根据现在的资源配额,A无法执行任务,B可以执行任务,如何让队列跳过A的任务,去执行到B的任务。
我现在的做法是在先运行,然后在任务里进行判断,有运行资源就运行,没有运行资源再塞进队列,不足是会破坏顺序。
走 事件
用 任务调度 是不是比较好点 ? 任务调度 逻辑判断是否有资源空闲。 使用 队列 --once 这个参数 只调用 有空闲资源的队列一次