null, который положил Google Cloud Platform 😱
Вокруг только и разговоров, что о post-mortem недавнего инцидента в Google Cloud 👩💻 12 июня Google Cloud прилёг. На несколько часов так прилёг. Упали App Engine, BigQuery, Cloud SQL, IAM, Cloud Run — и ещё с десяток ключевых сервисов.
А всё началось с Null Pointer Exception
29 мая в компонент GCP под названием Service Control добавили новую ветку логики для проверки квот. Код попал в прод, но не активировался — требовалась определённая конфигурация политики, которая на тот момент ещё не существовала.
12 июня эти политики всё-таки были задействованы. В Spanner записались данные с пустыми полями. Service Control начал использовать новую логику, где не было защиты от null. И началось: сервис стал падать в каждом регионе. Ошибки 503 прокатились по всем зависимым API. Глобальная катастрофа — за пару секунд.
Каковы корневые причины? *- Null Pointer Exception в новой логике квот.
-
Отсутствие feature flag’а — код сразу пошёл "в бой", без фазового включения.
-
Нет fallback-механизма (fail-open).
-
Не было адекватного тестирования — критическая ветка не активировалась до продакшна.
-
Мгновенная глобальная репликация метаданных — баг разлетелся по всему миру за секунды.*
Кто бы мог подумать, что в 2025 году глобальный сервис положит банальный NPE.
Мы, Java-разработчики, к сожалению, не удивлены
null — это старая боль JVM. Известный billion-dollar mistake, как его однажды окрестил Тони Хоар. За десятилетия было много попыток уменьшить ущерб от null:
*- Kotlin с его строгой null-безопасностью.
-
Optional в Java 8.
-
Проект* JSpecify*, который пытается ввести строгую спецификацию аннотаций nullability.
-* Черновик JEP'а про Nullable-типы на уровне JVM. А ведь в Go, несмотря на переименование null в nil, проблемы всё те же, хе-хе 👩💻
Крах Google Cloud — это textbook fail в области feature toggle практик. Если бы новая логика была обёрнута в фичефлаг с постепенным rollout — баг бы нашли до продакшна. Если бы был fail-open — сервис бы хотя бы не падал. Если бы была деградация, а не crash loop — миллионы клиентов не увидели бы 503.
Инфраструктурный код заслуживает не меньше внимания, чем продакт-фичи.
Любая система уязвима, если в ней нет культуры устойчивости к дефектам.