Java Portal | Программирование
12.3K subscribers
1.12K photos
92 videos
36 files
998 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
Подсказка по Spring Boot 4: коллекции с nullable-элементами (List<Nullable String>) помогают ловить NullPointerException на этапе компиляции вместо рантайма. Больше никаких сюрпризов при обработке API-ответов, где могут прилетать null.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
6
Недавно в регионе US-EAST-1 у AWS были сбои.

Как бы ты спроектировал деплой микросервиса и инфраструктуру вокруг, чтобы пережить падение одной инстансы, сбой базы данных или даже отказ целого дата-центра ?


Когда делаем систему с высокой доступностью, нужно сразу исходить из того, что все рано или поздно ломается. Поэтому закладываем автоматическое восстановление на каждом уровне.

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

Для базы данных используем репликацию. Есть primary и хотя бы одна hot-standby реплика в другой физической зоне. Все записи в primary сразу копируются на standby.

Практикуем Chaos Engineering: намеренно ломаем часть продовой инфраструктуры, например, убиваем сервисы или добавляем сетевые задержки. Смотрим, что автоматический failover реально срабатывает как задумано, а не только на бумаге.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Видишь разницу между этими двумя кусками кода? 👀

На первый взгляд делают одно и то же, но…

В первом варианте все классы вынуждены реализовывать методы, которые им вообще не нужны.

Во втором интерфейсы разделены: каждый класс берет только то, что реально использует.

Принцип разделения интерфейсов (ISP)

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍122
Не все данные обрабатываются одинаково. Понимание, когда подходит batch, а когда stream, решает, получится ли у тебя нормальная архитектура или скрытый тормоз внутри.

Batch Processing собирает данные и обрабатывает их пачками.
Подходит, когда нет требований к моментальной реакции: ежедневные отчеты, бухзакрытия, историческая аналитика.

Он проще, нормально тянет большие объемы и дешевле по деньгам,
но появляется задержка. Событие уже случилось, а ты обрабатываешь его потом.

Stream Processing работает с данными прямо в потоке.

Отлично для мониторинга, антифрода, рекомендаций в реальном времени.

Скорость выше, но инфраструктура сложнее и поддержка дороже.

Часто косячат: ставят stream там, где батча за глаза, или наоборот, лепят batch туда, где важна минимальная задержка.

Фишка не в том, чтобы выбрать самое модное, а в том, чтобы попасть в реальный ритм бизнеса и решить конкретную задачу.

А если ресурсы сильно ограничены, скорее всего, batch уже закрывает потребности.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Совет по Java: начиная с Java 8 можно легко убирать null значения с помощью list.removeIf(Objects::isNull)

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
13
Совет по Docker

Как понять, что раздувает образ

Любой Docker-образ состоит из слоев.
Каждая строка в Dockerfile добавляет новый слой.

По этим слоям можно понять, почему образ получается большим, долго собирается или плохо кешируется.

Вот как посмотреть слои и узнать, что именно менялось в каждом из них.

Используй утилиту dive.

Она показывает наглядно:

- какие слои созданы
- какие файлы добавлены или изменены
- сколько места занимает каждый слой

Когда начинаешь изучать слои образа, можно быстро выяснить:

• какая команда в Dockerfile добавляет лишний вес
• как оптимизировать сборку, чтобы образ был меньше и собирался быстрее

Dive также дает оценку «эффективности» образа. Она показывает, насколько много данных дублируется или просто впустую занимает место в слоях.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍94
Java/Backend. Интервью. Сценарный вопрос про распределенный лок:

У тебя есть критичный сервис, допустим обработка заказов, который крутится на нескольких инстансах в Kubernetes. Чтобы избежать гонки, когда два инстанса одновременно берут один и тот же заказ, ты ставишь распределенный лок через Redis setnx с TTL 10 секунд.

Какой критичный кейс все равно возможен, если один из инстансов словит Full GC паузу длиной 15 секунд сразу после получения лока? Опиши ситуацию split-brain и к чему она приведет по данным.

Как это разруливать на интервью:

→ сначала важно отметить, что простой Redis-лок с TTL помогает, если сервис просто упал, но создает новую, куда более опасную проблему

→ баг в том, что длинная пауза, например Full GC, может быть дольше, чем TTL лока

→ и вот что ломается (Split-Brain):

Service A берет лок,
и тут же уходит в GC на 15 секунд

Через 10 секунд Redis удаляет лок по TTL

Service B спокойно берет тот же лок,
и начинает обрабатывать заказ

Через 15 секунд Service A просыпается
все еще уверенный, что лок у него
и тоже обрабатывает этот же заказ

→ итог: два сервиса одновременно трогают один и тот же заказ. Данные ломаются. Например клиенту списывают деньги дважды.

→ реальное решение (меняем дизайн): вообще избавиться от лока

Кладем заказы в очередь сообщений,
например Kafka или RabbitMQ

Consumer group с несколькими инстансами читает этот топик

Брокер гарантирует, что каждое сообщение (заказ) уходит только одному инстансу из группы

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍2
Учебник по Java от Андрея Иванцова теперь доступен онлайн на GitBook. В нём собрано всё, что нужно новичку: от простых типов данных и строк до исключений и коллекций. Материал подан по делу, с примерами кода и понятными объяснениями.

Ссылка для тех, кто хочет прокачаться: andrey-ivantsov.gitbook.io/java

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👀7
Совет по Spring Boot 4. В Jackson 3 теперь в приоритете JsonMapper для работы с JSON. Обрати внимание на новый import. ObjectMapper из com.fasterxml больше не нужен. JsonMapper теперь основной инструмент для JSON в современных Spring-приложениях.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
7
Зарплата 207.000р у Middle-разработчика в Яндекс

«В день уходит несколько часов на созвоны, в остальное время закрываю задачки из спринта, редко перерабатываю. У компании топовый офис, но с коллективом как-то не заладилось. Радуюсь классному ДМС и стабильной зарплате» - middle разработчик из Яндекса.

Бигтех по-русски - канал с реальными зарплатами и историями IT-специалистов российского БигТеха. Там уже опубликованы рассказы программистов Альфа-банка, Сбера и Тинькофф 🤯

Читайте: @bigtech_russia
Please open Telegram to view this post
VIEW IN TELEGRAM
😁7
Spring Framework 7 добавил встроенный механизм ретраев. Больше не нужно подключать внешнюю зависимость spring-retry. Если надо больше контроля, чем даёт @Retryable, используй RetryTemplate

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Spring Boot 4 делает настройку HTTP-интерфейсов гораздо чище

Больше никакого ручного создания прокси и шаблонного кода. Просто используй @ImportHttpServices и готово.

Было 5+ строк конфигурации на каждый клиент → стала одна аннотация

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
5
kill -15 даёт ядру возможность завершить процесс аккуратно, чтобы тот успел всё почистить и закрыть как положено.

kill -9 — это уже жёсткий килл, без шансов на «прощальную речь». Процесс просто вырубается, не успев освободить ресурсы или записать данные.

Вот пример с node http-server: при обычном завершении (-15) он корректно закрывает соединения, а при -9 просто падает без возможности что-то доработать.

Короче, будь готов к -9, но надейся на -15.

👉 Java PortalМ
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM