TGViewer
Библиотека джависта | Java, Spring, Maven, Hibernate Библиотека джависта | Java, Spring, Maven, Hibernate @javaproglib · 22K subscribers
Post #7740 1.94K
🪄 Магия Spring Boot, которая тихо убивает прод

Spring Boot прекрасен ровно до того момента, пока «оно само работает» не превращается в «оно само сломалось — и непонятно, где». Собрал фичи, которые на собесе звучат как удобство, а в 3 ночи как инцидент.

1️⃣ @Transactional, который держит коннект дольше, чем надо

Метод помечен @Transactional, а внутри запрос в БД, потом HTTP-вызов во внешний сервис, потом ещё один запрос. Всё это время коннект из пула занят. Даунстрим притормозил на 2 секунды → коннект висит 2 секунды → под нагрузкой пул выгребается, и приложение встаёт колом. CPU не загружен, БД не захлёбывается, а реквесты копятся.

Транзакция должна быть короткой и без сетевых вызовов внутри. Внешние интеграции выносим за её границы.

2️⃣ Self-invocation: аннотация, которая молча не работает

@Transactional, @Async, @Cacheable живут через прокси. Зовёшь аннотированный метод из этого же класса → прокси в обход, аннотация не срабатывает.

Лечится выносом в отдельный бин или self-injection. Но сначала надо просто знать, что так бывает.

3️⃣ Open Session In View — включён по умолчанию

spring.jpa.open-in-view=true из коробки. Звучит безобидно, на деле Hibernate-сессия живёт до рендера ответа: ленивые связи подтягиваются уже в слое контроллера, и ты ловишь N+1 там, где сервис давно отработал. Плюс коннект держится дольше нужного. На дев-стенде незаметно, а под нагрузкой привет latency.

Осознанно ставим false и грузим ровно то, что нужно.

4️⃣ HikariCP с дефолтным пулом

maximum-pool-size=10 по умолчанию. Для лёгкого сервиса — ок. Под реальным трафиком — узкое горлышко, о котором узнаёшь не из кода, а из графика глубины пула под нагрузкой. Тюнить надо не «побольше», а по формуле под ядра БД и характер нагрузки. Просто выкрутить в 200 — это обменять одну проблему на дедлоки в базе.

5️⃣ Actuator, открытый наружу

/actuator/env, /configprops, /heapdump — удобно для дебага и шикарно для того, кто найдёт их в проде: креды, конфиги, дампы памяти. Многое прикрыто по умолчанию, но «давайте включим всё, чтобы видеть метрики» и приехали. Открываем точечно, прячем за security, health/metrics держим отдельно от чувствительного.

6️⃣ Ретраи без circuit breaker = retry storm

Даунстрим тормозит → добавляешь 3 ретрая с бэкоффом. Но он тормозит, потому что перегружен. Твой ретрай шлёт второй запрос, третий. Помножь на всех клиентов. За полторы минуты лёгкое замедление превращается в каскадный отказ всей системы.

Ретраи — только с circuit breaker, jitter и лимитом. Иначе ты не лечишь нагрузку, а добиваешь.

🔹 Магия Spring Boot не баг, а разумные дефолты для быстрого старта. Беда в том, что дефолты «чтобы запуститься» и дефолты «чтобы держать прод» — это разные дефолты. Сеньорность тут не в том, чтобы знать всё наизусть, а в привычке спрашивать: «а что эта аннотация делает под капотом и под нагрузкой?»

💬 Какая фича Spring Boot подставила вас в проде в последний раз?

══════ Навигация ══════
Вакансии • Задачи • Собесы

🐸 Библиотека джависта

#CoreJava
  • 👍 15
  • 🔥 3
  • ❤ 2
  • 😁 2
  • 🤔 1
More from @javaproglib
  1. Oct 12, 2026👀 Как вы смотрите видео? Разбираете урок, слушаете интервью фоном или начинаете на телефо…
  2. Oct 10, 2026Post #7892
  3. Oct 10, 2026Read. Write. Edit. Bash. Это базовый набор операций Pi — агента, на котором построен OpenC…
  4. Oct 2, 2026🎹 Что делать после ChatGPT? Следующий шаг — AI-агенты. Они не просто отвечают на запросы,…
  5. Sep 30, 2026🔥 Последний день для разработчиков AI уже пишет код. Теперь важнее научиться встраивать е…
  6. Sep 30, 2026🫡 Шпаргалка по аннотациям Spring Boot @Autowired, @RestController, @Transactional, @Cache…
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 →