Fire-and-forget удобно выглядит в обработчике: запустили горутину, вернули ответ и забыли. Но под нагрузкой появляются проблемы:
- число горутин ничем не ограничено;
-
request.Context() отменяется после завершения handler;- panic в фоновой задаче может уронить процесс;
- при shutdown незавершённая работа теряется.
Практичнее отправлять фоновые задачи в небольшой worker pool:
- фиксированные воркеры ограничивают параллелизм;
- буфер создаёт backpressure;
-
recover изолирует panic;- каждая задача получает собственный timeout;
- graceful shutdown завершает принятую работу.
Важно сначала остановить HTTP-сервер, а затем закрывать пул - иначе новые запросы продолжат добавлять задачи.
Но такой пул хранится в памяти. Если нужны повторы и гарантированная доставка, используйте устойчивую очередь задач.
Никогда не запускайте горутину, пока не понимаете, кто и как её остановит.
https://rednafi.com/go/supervised-fire-and-forget/
#Go #Golang #Concurrency #Backend
