Урок 06

Очереди и фоновые задачи

AI-запросы медленные. Очереди позволяют не блокировать HTTP.

Проблема

Route::post('/analyze', function (Request $request) {
    $response = (new SalesCoach)->prompt($request->input('transcript'));
    return response()->json(['analysis' => (string) $response]);
});

Пользователь ждёт. Если запрос длинный — таймаут.

Решение: queue()

use Laravel\Ai\Responses\AgentResponse;

(new SalesCoach)
    ->queue($request->input('transcript'))
    ->then(function (AgentResponse $response) {
        // уведомить пользователя
        $user->notify(new AnalysisDone($response));
    })
    ->catch(function (Throwable $e) {
        Log::error('AI failed', ['error' => $e->getMessage()]);
    });

return response()->json(['status' => 'queued']);

Запрос выполняется в фоне. Пользователь получает уведомление.

Очередь для broadcast

(new SalesCoach)->broadcastOnQueue(
    'Анализ...',
    new Channel('analysis.' . $user->id),
);

Конфигурация очереди

В .env:

QUEUE_CONNECTION=database

Или Redis для продакшена.

Когда использовать

  • Генерация длинного текста
  • Анализ больших документов
  • Генерация изображений
  • Batch-обработка
  • Всё, что дольше 3–5 секунд

Итоги

  • queue() для фоновых задач
  • then() и catch() для обработки
  • broadcastOnQueue() для каналов
  • Не блокирует HTTP
  • Для длинных запросов