Обидва групують завдання, але з протилежною метою.
Ланцюжок (Bus::chain) - послідовність. Наступне завдання стартує лише після успіху попереднього; якщо одне впало, решта не виконується.
Bus::chain([
new ProcessPodcast($podcast),
new OptimizePodcast($podcast),
new ReleasePodcast($podcast),
])->catch(fn (Throwable $e) => report($e))->dispatch();
Підходить, коли кроки залежать один від одного: не можна публікувати те, що ще не оброблено.
Пакет (Bus::batch) - паралельність. Завдання виконуються незалежно, кількома воркерами одночасно, а колбеки then, catch, finally спрацьовують, коли пакет завершено.
Bus::batch($users->map(fn ($u) => new SendNewsletter($u)))
->then(fn (Batch $batch) => Log::info('Розсилку завершено'))
->allowFailures()
->dispatch();
Підходить для великої кількості однотипної роботи: розсилка, імпорт частинами. Пакет показує прогрес, але порядку не гарантує.
Деталі: пакетам потрібна таблиця job_batches (make:queue-batches-table), а завдання - з трейтом Batchable. Скасування пакета не зупиняє вже взяті завдання, тож кожне перевіряє $this->batch()->cancelled() на початку.