Поделюсь опытом, готового решения в Laravel из коробки нет.
Если надо остаться в рамках Laravel то есть несколько вариантов. Можно допилить функционал в самом Laravel, но код внутри не готов к такой кастомизации. (говорю заранее это будет жесткий костыль, он будет мешать нормальной работе очередей). Второй вариант, сделать еще одну базовую очередь.
Что я имею в виду?
Вариант №1
Мы берем простой кэш или redis(сразу) с его очередью(вроде это lists) , и добавляем туда наши jobs, каждый раз когда когда job выполняется, она смотрит должна ли именно она сейчас выполниться и если нет, то скрипт ее возвращает обратно в обычную очередь.
Соответственно запуск job регулируется другой очередью(то есть вы организуете добавление jobs в обычную очередь), из минусов, ваши jobs будут туда сюда гоняться скриптом и полезной работы не какой. Если например один уйдет в fail jobs - worker будет гонять туда сюда пока вы не выполните его и не восстановиться работа.
Вариант №2
Второй вариант сделать уже нормальную базовую очередь. К примеру, делаете таблицу в базе данных. Когда job в нормальном flow должен отправляться в очередь, вы отправляете его в эту таблицу. Дальше вы пишите своего демона(worker) который просматривает вашу таблицу на предмет выполнения.
Если что то готово выполняться, он отправляет его в обычную очередь. Добавляете в эту таблицу статусы и вперед.
Job добавилась в таблицу - "ready"
Job ушла - "в процессе"
Job выполнилась - "удалилась из таблицы или approved"
Возможно еще есть колонки для группировки(например принадлежность какой нибудь группе), теперь ваш демон может запускать их по очереди даже в рамках групп.
Соответственно все идут друг за другом, пока один "в процессе" остальные не берутся.