TGViewer
Golang Golang @golang_google · 40.5K subscribers
Post #3588 7.32K
🐹 `go func()` без контроля - один из самых простых способов сломать Go-сервис

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
  • ❤ 11
  • 👍 8
  • 🔥 3
  • 😁 1
  • 😱 1
More from @golang_google
  1. Sep 21, 2026🛠 Ax - фреймворк в стиле DSPy для Go, TypeScript, Python, Java, C++, и Rust Вы описываете…
  2. Sep 18, 2026🔥 Rune - быстрый IDE и terminal multiplexer с GPU-рендерингом, который теперь открыт на G…
  3. Sep 16, 2026🔥 Большой гайд по миграции с Go на Rust Для разработчиков переход обычно упирается не в с…
  4. Sep 15, 2026🔥 Yoke - управление пакетами Kubernetes без гор YAML Вместо сложных Helm-шаблонов Yoke по…
  5. Sep 13, 2026🔥 Yzma - прямое подключение `llama.cpp` к Go-приложениям для локального inference Проект…
  6. Sep 12, 2026🐳 Как правильно использовать Docker для Go-приложения - пошаговый гайд Хороший разбор от…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →