This media is not supported in your browser
VIEW IN TELEGRAM
Сегодня — Java 30 лет 🎂
Опубликовал большую статью на Хабре — о том, как развивалась Java, что происходило внутри JVM, и куда всё это движется дальше.
📌 В статье:
— История версий Java: от Playground до Java 24
— Эволюция языка
— Как работает JVM и почему HotSpot такой «горячий»
— Проекты OpenJDK: Leyden, GraalVM, CRaC — зачем они нужны и как меняют подход к производительности
— И главное — как Java готовится к будущему
🧠 Подойдёт всем, кто пишет на Java или просто хочет понять, как устроена одна из самых влиятельных технологий в мире разработки.
📖 Читать статью на Хабр
#java_hub_history
Опубликовал большую статью на Хабре — о том, как развивалась Java, что происходило внутри JVM, и куда всё это движется дальше.
📌 В статье:
— История версий Java: от Playground до Java 24
— Эволюция языка
— Как работает JVM и почему HotSpot такой «горячий»
— Проекты OpenJDK: Leyden, GraalVM, CRaC — зачем они нужны и как меняют подход к производительности
— И главное — как Java готовится к будущему
🧠 Подойдёт всем, кто пишет на Java или просто хочет понять, как устроена одна из самых влиятельных технологий в мире разработки.
📖 Читать статью на Хабр
#java_hub_history
🔥9❤1
🚀 Двоичная Java: CDS, CRaC и AOT для ускорения запуска и прогрева JVM
🔍 Миф №1 о Java:
> «Java — это медленно»
Да, лет 20 назад это могло быть правдой. Но JVM с тех пор прошла огромный путь.
В классическом варианте Java-байткод исполняется через интерпретатор — по сути, цикл со switch-case, где инструкции переводятся на лету. Это действительно не быстро.
📈 Первый прорыв — JIT-компиляция (Just-in-Time): часто вызываемые методы начали компилироваться в машинный код во время выполнения. Это дало солидный прирост производительности.
💡 Но на этом оптимизации не остановились. Сегодня в арсенале JVM есть:
* CDS (Class Data Sharing) — сериализация внутренних представлений классов, чтобы ускорить их загрузку из архива.
* CRaC (Coordinated Restore at Checkpoint) — снятие снепшота уже «прогретой» JVM, чтобы потом мгновенно восстановить её в этом состоянии.
* AOT (Ahead-of-Time compilation) — компиляция Java-приложения в нативный бинарник заранее, без участия JIT в рантайме.
🧪 А на подходе ещё Project Leyden, который обещает сделать JVM по-настоящему предсказуемой и «запускаемой с кнопки» — благодаря condensers и training runs.
🎤 Обо всём этом я рассказывал на HighLoad++ 2024. Видео пока не выложили, но мои друзья из Axiom JDK подготовили текстовую версию доклада 📄
📎 Читайте: «Двоичная Java: CDS, CRaC и AOT для ускорения запуска и прогрева JVM»
#java_hub_jvm
🔍 Миф №1 о Java:
> «Java — это медленно»
Да, лет 20 назад это могло быть правдой. Но JVM с тех пор прошла огромный путь.
В классическом варианте Java-байткод исполняется через интерпретатор — по сути, цикл со switch-case, где инструкции переводятся на лету. Это действительно не быстро.
📈 Первый прорыв — JIT-компиляция (Just-in-Time): часто вызываемые методы начали компилироваться в машинный код во время выполнения. Это дало солидный прирост производительности.
💡 Но на этом оптимизации не остановились. Сегодня в арсенале JVM есть:
* CDS (Class Data Sharing) — сериализация внутренних представлений классов, чтобы ускорить их загрузку из архива.
* CRaC (Coordinated Restore at Checkpoint) — снятие снепшота уже «прогретой» JVM, чтобы потом мгновенно восстановить её в этом состоянии.
* AOT (Ahead-of-Time compilation) — компиляция Java-приложения в нативный бинарник заранее, без участия JIT в рантайме.
🧪 А на подходе ещё Project Leyden, который обещает сделать JVM по-настоящему предсказуемой и «запускаемой с кнопки» — благодаря condensers и training runs.
🎤 Обо всём этом я рассказывал на HighLoad++ 2024. Видео пока не выложили, но мои друзья из Axiom JDK подготовили текстовую версию доклада 📄
📎 Читайте: «Двоичная Java: CDS, CRaC и AOT для ускорения запуска и прогрева JVM»
#java_hub_jvm
👍5🔥2
🔁 Saga Pattern в микросервисной архитектуре: можно ли обойтись без распределённых транзакций?
Выступил на онлайн-встрече "Книжного клуба .rar" — Telegram-сообщества для Java-разработчиков, где регулярно обсуждают профессиональную литературу, технологии и устраивают встречи с практикующими инженерами 👉 @point_rar
В этот раз разбирали реализацию паттерна Saga на Java с использованием Temporal
Демо-проект на GitHub - https://github.com/RustamKuramshin/spring-boot-saga-pattern-example
Презентация мини-доклада тут
📦 Что такое Saga и зачем она нужна?
В распределённой системе аннотация Transactional не работает между сервисами. А бизнесу всё ещё нужно "всё или ничего":
если деньги списались, товар должен быть зарезервирован и доставлен. Если нет — откатить всё назад.
Saga — это паттерн, который разбивает такую бизнес-транзакцию на цепочку локальных транзакций, и если что-то идёт не так, вызывает компенсационные действия (например, вернуть деньги).
🧩 Два способа реализовать Saga
🔸 Оркестрация
Один сервис (оркестратор) управляет всей логикой: вызывает шаги, следит за результатами, вызывает компенсации.
➕ Централизованно, легко отлаживать
➖ Меньше изоляции между сервисами
🔸 Хореография
Сервисы реагируют на события (event-driven): "платёж прошёл" → "резервируй товар" → "создай доставку".
➕ Слабо связанная архитектура
➖ Сложно проследить цепочку событий и откатов
⚙️ В Temporal реализация Saga — это workflow, в котором бизнес-процесс описывается обычным Java-кодом.
Он:
- сохраняет состояние каждого шага (event sourcing),
- автоматически повторяет activities при сбоях,
- управляет timeouts и compensation logic,
- отделяет workflow (координацию) от activity (действий).
Например, просто пишешь:
А Temporal сам заботится о повторяемости, масштабировании и отказоустойчивости.
Если интересно больше узнать про Temporal, рекомендую посмотреть доклад Петра Сальникова с JPoint. Мне повезло присутствовать в зале на самом докладе. В дискуссионной зоне Петр ответил на множество вопросов как раз в тот период, когда мне нужно было самому разбираться с Temporal.
#java_hub_patterns
Выступил на онлайн-встрече "Книжного клуба .rar" — Telegram-сообщества для Java-разработчиков, где регулярно обсуждают профессиональную литературу, технологии и устраивают встречи с практикующими инженерами 👉 @point_rar
В этот раз разбирали реализацию паттерна Saga на Java с использованием Temporal
Демо-проект на GitHub - https://github.com/RustamKuramshin/spring-boot-saga-pattern-example
Презентация мини-доклада тут
📦 Что такое Saga и зачем она нужна?
В распределённой системе аннотация Transactional не работает между сервисами. А бизнесу всё ещё нужно "всё или ничего":
если деньги списались, товар должен быть зарезервирован и доставлен. Если нет — откатить всё назад.
Saga — это паттерн, который разбивает такую бизнес-транзакцию на цепочку локальных транзакций, и если что-то идёт не так, вызывает компенсационные действия (например, вернуть деньги).
🧩 Два способа реализовать Saga
🔸 Оркестрация
Один сервис (оркестратор) управляет всей логикой: вызывает шаги, следит за результатами, вызывает компенсации.
➕ Централизованно, легко отлаживать
➖ Меньше изоляции между сервисами
🔸 Хореография
Сервисы реагируют на события (event-driven): "платёж прошёл" → "резервируй товар" → "создай доставку".
➕ Слабо связанная архитектура
➖ Сложно проследить цепочку событий и откатов
⚙️ В Temporal реализация Saga — это workflow, в котором бизнес-процесс описывается обычным Java-кодом.
Он:
- сохраняет состояние каждого шага (event sourcing),
- автоматически повторяет activities при сбоях,
- управляет timeouts и compensation logic,
- отделяет workflow (координацию) от activity (действий).
Например, просто пишешь:
activities.makePayment();
saga.addCompensation(activities::cancelPayment);
А Temporal сам заботится о повторяемости, масштабировании и отказоустойчивости.
Если интересно больше узнать про Temporal, рекомендую посмотреть доклад Петра Сальникова с JPoint. Мне повезло присутствовать в зале на самом докладе. В дискуссионной зоне Петр ответил на множество вопросов как раз в тот период, когда мне нужно было самому разбираться с Temporal.
#java_hub_patterns
👍10🔥4❤2
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 (распределённая база данных от Google) записались данные с пустыми полями. Service Control начал использовать новую логику, где не было защиты от null. И началось: сервис стал падать в каждом регионе. Ошибки 503 прокатились по всем зависимым API. Глобальная катастрофа — за пару секунд.
Каковы корневые причины?
- Null Pointer Exception в новой логике квот.
- Отсутствие feature flag’а — код сразу пошёл "в бой", без фазового включения.
- Нет fallback-механизма (fail-open).
- Не было адекватного тестирования — критическая ветка не активировалась до продакшна.
- Мгновенная глобальная репликация метаданных — баг разлетелся по всему миру за секунды.
Кто бы мог подумать, что в 2025 году глобальный сервис положит банальный NPE.
Мы, Java-разработчики, к сожалению, не удивлены
null — это старая боль JVM.
Известный billion-dollar mistake, как его однажды окрестил Тони Хоар. За десятилетия было много попыток уменьшить ущерб от null:
- Kotlin с его строгой null safety.
- Optional в Java 8.
- Проект JSpecify, который пытается ввести строгую спецификацию аннотаций nullability.
- Черновик JEP'а про Nullable-типы на уровне JVM.
А ведь в Go (на нём пишут в Google), несмотря на переименование null в nil, проблемы всё те же, хе-хе👩💻
Крах Google Cloud — это textbook fail в области feature toggle практик.
Если бы новая логика была обёрнута в фичефлаг с постепенным rollout — баг бы нашли до продакшна.
Если бы был fail-open — сервис хотя бы не падал.
Если бы была деградация, а не crash loop — миллионы клиентов не увидели бы 503.
Инфраструктурный код заслуживает не меньше внимания, чем продакт-фичи.
Любая система уязвима, если в ней нет культуры устойчивости к дефектам.
#java_hub_news
Вокруг только и разговоров, что о post-mortem недавнего инцидента в Google Cloud
12 июня Google Cloud прилёг. На несколько часов так прилёг. Упали App Engine, BigQuery, Cloud SQL, IAM, Cloud Run — и ещё с десяток ключевых сервисов.
А всё началось с Null Pointer Exception
29 мая в компонент GCP под названием Service Control добавили новую ветку логики для проверки квот. Код попал в прод, но не активировался — требовалась определённая конфигурация политики, которая на тот момент ещё не существовала.
12 июня эти политики всё-таки были задействованы. В Spanner (распределённая база данных от Google) записались данные с пустыми полями. Service Control начал использовать новую логику, где не было защиты от null. И началось: сервис стал падать в каждом регионе. Ошибки 503 прокатились по всем зависимым API. Глобальная катастрофа — за пару секунд.
Каковы корневые причины?
- Null Pointer Exception в новой логике квот.
- Отсутствие feature flag’а — код сразу пошёл "в бой", без фазового включения.
- Нет fallback-механизма (fail-open).
- Не было адекватного тестирования — критическая ветка не активировалась до продакшна.
- Мгновенная глобальная репликация метаданных — баг разлетелся по всему миру за секунды.
Кто бы мог подумать, что в 2025 году глобальный сервис положит банальный NPE.
Мы, Java-разработчики, к сожалению, не удивлены
null — это старая боль JVM.
Известный billion-dollar mistake, как его однажды окрестил Тони Хоар. За десятилетия было много попыток уменьшить ущерб от null:
- Kotlin с его строгой null safety.
- Optional в Java 8.
- Проект JSpecify, который пытается ввести строгую спецификацию аннотаций nullability.
- Черновик JEP'а про Nullable-типы на уровне JVM.
А ведь в Go (на нём пишут в Google), несмотря на переименование null в nil, проблемы всё те же, хе-хе
Крах Google Cloud — это textbook fail в области feature toggle практик.
Если бы новая логика была обёрнута в фичефлаг с постепенным rollout — баг бы нашли до продакшна.
Если бы был fail-open — сервис хотя бы не падал.
Если бы была деградация, а не crash loop — миллионы клиентов не увидели бы 503.
Инфраструктурный код заслуживает не меньше внимания, чем продакт-фичи.
Любая система уязвима, если в ней нет культуры устойчивости к дефектам.
#java_hub_news
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥4❤2😱2