Загрузка…
Загрузка…
Go · junior · сложность 4
Долгосрочные задачи не следует выполнять синхронно в обработчике HTTP, поскольку это увеличивает задержку, снижает пропускную способность и увеличивает риск таймаутов/перебоев клиента. Правильный подход — асинхронное выполнение через очередь/воркеры.
Конечная точка HTTP принимает запрос и проверяет полезную нагрузку.
Создает задание (с job_id, статусом и метаданными).
Помещает задание в очередь (брокер/таблица задач).
Возвращает быстрый ответ (202 Accepted + job_id) клиенту.
Фоновые работники обрабатывают задачу вне контекста HTTP.
queued, running, succeeded, failed, canceled.Конечная точка опроса для job_id.
Вебхук/обратный вызов.
Push-канал (SSE/WebSocket) — при необходимости UX практически в реальном времени.
Выполните тяжелую бизнес-операцию непосредственно в обработчике.
Не иметь постоянного статуса работы.
Отсутствие повторных попыток и сценария недоставленных сообщений.
Нет ограничений на количество рабочих и контроль очереди.
Чтобы не блокировать HTTP-запросы, долго выполняющиеся задачи следует декомпозировать в модель accept -> enqueue -> async process -> observe result. Это обеспечивает стабильный API, управляемую пропускную способность и предсказуемую производительность под нагрузкой.
func (h *Handler) StartReport(w http.ResponseWriter, r *http.Request) {
jobID := uuid.NewString()
_ = h.queue.Publish(r.Context(), Job{ID: jobID, Type: "build_report"})
w.WriteHeader(http.StatusAccepted)
_ = json.NewEncoder(w).Encode(map[string]string{"job_id": jobID})
}Долгосрочные задачи не следует выполнять синхронно в обработчике HTTP, поскольку это увеличивает задержку, снижает пропускную способность и увеличивает риск таймаутов/перебоев клиента.