Google увеличил функционал Agent Development Kit для Java, внедрив поддержку LangChain4j. Теперь Java-инженеры способны подключать модели OpenAI, Anthropic, Mistral и прочие, разрабатывая многоагентные решения с более гибким контролем и усовершенствованной логикой.
Подробности: тык
👉 Java Portal
Подробности: тык
Please open Telegram to view this post
VIEW IN TELEGRAM
InfoQ
Google's Agent Development Kit for Java Adds Integration with LangChain4j
The latest release of the Agent Development Kit for Java, version 0.2.0, marks a significant expansion of its capabilities through the integration with the LangChain4j LLM framework, which opens it up to all the large language models supported by the framework.
❤5👍2
Вопрос для собеседования Java/Backend:
Современные приложения могут держать пользователя залогиненным без серверного хранения сессий благодаря JWT
Это компактный и безопасный токен, который сервер подписывает и отдает клиенту. Клиент хранит его и отправляет вместе с запросами, а сервер проверяет подпись и доверяет данным внутри токена без обращения к базе.
JWT состоит из трёх частей — заголовка с алгоритмом и типом, полезной нагрузки с пользовательскими данными (claims) и подписи, которая гарантирует подлинность.
Такой подход делает авторизацию stateless: вся необходимая информация хранится в самом токене.
Чтобы обеспечить безопасность, важно всегда использовать HTTPS, задавать короткий срок жизни токена и предусматривать механизм отзыва украденных токенов.
👉 Java Portal
Как современные приложения оставляют вас залогиненным без хранения сессии на сервере?🫖
Современные приложения могут держать пользователя залогиненным без серверного хранения сессий благодаря JWT
Это компактный и безопасный токен, который сервер подписывает и отдает клиенту. Клиент хранит его и отправляет вместе с запросами, а сервер проверяет подпись и доверяет данным внутри токена без обращения к базе.
JWT состоит из трёх частей — заголовка с алгоритмом и типом, полезной нагрузки с пользовательскими данными (claims) и подписи, которая гарантирует подлинность.
Такой подход делает авторизацию stateless: вся необходимая информация хранится в самом токене.
Чтобы обеспечить безопасность, важно всегда использовать HTTPS, задавать короткий срок жизни токена и предусматривать механизм отзыва украденных токенов.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍5
This media is not supported in your browser
VIEW IN TELEGRAM
Держите репозиторий на GitHub где собрана отличная подборка бесплатных материалов по программированию.
Здесь собраны сотни книг по самым разным направлениям: от веб-разработки и геймдева до AI, блокчейна, создания приложений и даже prompt engineering.😎
👉 Java Portal
Здесь собраны сотни книг по самым разным направлениям: от веб-разработки и геймдева до AI, блокчейна, создания приложений и даже prompt engineering.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤3
Вопрос из Java-собеседования (сценарный):
Ты используешь
Тимлид просит тебя отрефакторить это, так как field injection часто считается плохой практикой.
Подумай о минусах field injection:
→ Visibility: скрывает обязательные зависимости класса.
→ Testability: усложняет unit-тестирование, часто требует рефлексии.
→ Runtime Issues: может привести к NullPointerException, если зависимость отсутствует.
→ Design: поощряет классы с чрезмерной ответственностью (нарушение SRP).
Какой рекомендуемый вариант?
→ Constructor Injection.
Зависимости явно передаются при создании объекта, делая их обязательными.
Почему Constructor Injection лучше?
→ Explicit: явно показывает, что нужно классу для работы.
→ Guaranteed: приложение не поднимется, если зависимости нет.
→ Immutable: final-поля безопаснее и дружелюбнее к многопоточности.
→ Testable: легко замокать и прокинуть зависимости в тестах.
Это приводит к более надежному и поддерживаемому коду.
👉 Java Portal
Ты используешь
@Autowired
для field injection в Spring-проекте. Это просто и работает.@Component
public class UserService {
@Autowired
private UserRepository userRepository;
}
Тимлид просит тебя отрефакторить это, так как field injection часто считается плохой практикой.
Подумай о минусах field injection:
→ Visibility: скрывает обязательные зависимости класса.
→ Testability: усложняет unit-тестирование, часто требует рефлексии.
→ Runtime Issues: может привести к NullPointerException, если зависимость отсутствует.
→ Design: поощряет классы с чрезмерной ответственностью (нарушение SRP).
Какой рекомендуемый вариант?
→ Constructor Injection.
Зависимости явно передаются при создании объекта, делая их обязательными.
@Component
public class UserService {
private final UserRepository userRepo; // final!
public UserService(UserRepository userRepo) {
this.userRepo = userRepo;
}
}
Почему Constructor Injection лучше?
→ Explicit: явно показывает, что нужно классу для работы.
→ Guaranteed: приложение не поднимется, если зависимости нет.
→ Immutable: final-поля безопаснее и дружелюбнее к многопоточности.
→ Testable: легко замокать и прокинуть зависимости в тестах.
Это приводит к более надежному и поддерживаемому коду.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍3💊1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁17❤10
Топ-53 задач на Java для подготовки к собеседованиям
В статье собраны самые популярные задания по Java, полезные курсы по DevOps, Linux и паттернам проектирования, а также список вопросов для подготовки к техническим интервью.
👉 Java Portal
В статье собраны самые популярные задания по Java, полезные курсы по DevOps, Linux и паттернам проектирования, а также список вопросов для подготовки к техническим интервью.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5❤3
Подготовка к собеседованию по Java Microservices
Без понимания ключевых концепций микросервисов сложно успешно пройти собеседование на backend-разработчика. Даже если вы не реализовывали их на практике, базовое знание даст серьёзное преимущество. Сохрани себе этот список как краткий гид или план подготовки.
👉 Java Portal
Без понимания ключевых концепций микросервисов сложно успешно пройти собеседование на backend-разработчика. Даже если вы не реализовывали их на практике, базовое знание даст серьёзное преимущество. Сохрани себе этот список как краткий гид или план подготовки.
Монолит vs Микросервисы → масштабирование отдельных функций независимо
Проектирование микросервиса → изоляция управления профилем пользователя
Паттерн API Gateway → единая точка входа для клиентов
Взаимодействие сервисов (REST vs Messaging) → асинхронная очередь обработки заказов
Паттерн Circuit Breaker → предотвращение каскадных сбоев сервисов
Spring Cloud Load Balancer → распределение трафика между инстансами
Spring Cloud Config → управление внешними конфигурационными параметрами
Service discovery (Eureka/Consul) → автоматический поиск сервисов друг другом
Feign Client vs WebClient → блокирующие и неблокирующие вызовы
Event-driven архитектура и Kafka → обработка потоков данных в реальном времени
Отдельная база для сервиса vs общая база → разделение уровня хранения данных
Паттерн Saga → согласованность распределённых транзакций
Аутентификация на основе JWT и OAuth2 → безопасные stateless API
Безопасность в API Gateway → централизованная аутентификация и авторизация запросов
Observability (логи, трассировка, метрики) → отладка проблем в продакшене
Prometheus и Grafana → мониторинг состояния системы и дашборды
Стратегии деплоя в Kubernetes → авто-масштабирование и самовосстановление приложений
Blue-Green и Canary-деплой → нулевой даунтайм и минимальные риски при релизах
Когда использовать WebFlux → высоконагруженные и низколатентные API
CQRS и Event Sourcing → разделение моделей чтения и записи при сложных сценариях
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Как тестировать Spring Boot приложения в Java?
Статья объясняет, как использовать
👉 Java Portal
Статья объясняет, как использовать
@SpringBootTest
, разницу между юнит- и интеграционными тестами, а также даёт советы по ускорению тестов. Полезно для разработчиков любого уровня, работающих со Spring Boot и микросервисами.Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Многие начинают с Java и используют
Кажется, что это «упрощает код», например при вызове методов, но на самом деле
В Java
- Статическое поле существует в памяти только один раз и шарится между всеми объектами этого класса.
- Статический метод можно вызвать без создания экземпляра.
- Жизненный цикл статических сущностей начинается при загрузке класса в память и заканчивается только при завершении JVM.
Для чего используется?🤔
- Для объявления констант (
- Для утилитарных методов (например,
Где начинаются проблемы?
- Когда используешь
- Когда превращаешь его в «глобальную зависимость», и код становится тяжело тестировать, плюс возникает сильная связность.
👉 Java Portal
static
повсюду. Кажется, что это «упрощает код», например при вызове методов, но на самом деле
static
— это довольно точное понятие, которое стоит хорошо понимать. В Java
static
означает, что что-то принадлежит классу, а не экземпляру. То есть: - Статическое поле существует в памяти только один раз и шарится между всеми объектами этого класса.
- Статический метод можно вызвать без создания экземпляра.
- Жизненный цикл статических сущностей начинается при загрузке класса в память и заканчивается только при завершении JVM.
Для чего используется?
- Для объявления констант (
public static final
), которые никогда не меняются. - Для утилитарных методов (например,
Collections.sort()
), которые не зависят от внутреннего состояния объекта. Где начинаются проблемы?
- Когда используешь
static
для переменных, которые на самом деле должны быть частью состояния объекта. - Когда превращаешь его в «глобальную зависимость», и код становится тяжело тестировать, плюс возникает сильная связность.
static
— это не шорткат. Это способ сказать: «это уникально и шарится по всему приложению».
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍3
Java Streams Cheat Sheet
Пример кода со всеми базовыми приёмами работы со Stream API:
👉 Java Portal
Пример кода со всеми базовыми приёмами работы со Stream API:
преобразование коллекций
flatMap, mapMulti, peek
сортировка, min/max, distinct
проверки (allMatch, anyMatch)
объединение (reduce, joining)
группировка и разбиение (groupingBy, partitioningBy)
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12
CQRS — один из самых популярных вопросов на собеседованиях Java/backend-разработчиков, связанных с взаимодействием микросервисов.
При этом обычно не задают вопрос в формате «Дайте определение CQRS», а формулируют его через реальный сценарий.
Сценарий:
Вопросы:
Определите проблему: Какую ключевую архитектурную проблему этот пример демонстрирует в части работы с данными и почему единая модель данных не справляется?
Предложите решение: Как вы бы переработали этот сервис, чтобы устранить проблемы с производительностью и избыточной сложностью? Назовите архитектурный паттерн и его основной принцип.
Ответ:
CQRS решает эту задачу за счёт разделения моделей и баз данных для записи и чтения.
Запись (заказы): команды обновляют выделенную нормализованную базу для записи (оптимизированную под транзакции).
Чтение (отчёты): события записи асинхронно обновляют отдельную денормализованную базу для чтения (оптимизированную под быстрые запросы и отчётность).
CQRS чаще всего реализуется с использованием брокера сообщений.
👉 Java Portal
При этом обычно не задают вопрос в формате «Дайте определение CQRS», а формулируют его через реальный сценарий.
Сценарий:
Сервис заказов на e-commerce платформе в данный момент обрабатывает все операции (массовое создание и обновление заказов, поиск заказов клиентов, формирование сложных отчётов по продажам) через одну общую реляционную базу данных.
Во время пиковых нагрузок тяжёлые отчётные запросы вызывают серьёзные замедления транзакционных операций, что ухудшает пользовательский опыт. Кроме того, сама модель данных заказов становится чрезмерно сложной, пытаясь одновременно удовлетворить разные потребности.
Вопросы:
Определите проблему: Какую ключевую архитектурную проблему этот пример демонстрирует в части работы с данными и почему единая модель данных не справляется?
Предложите решение: Как вы бы переработали этот сервис, чтобы устранить проблемы с производительностью и избыточной сложностью? Назовите архитектурный паттерн и его основной принцип.
Ответ:
CQRS решает эту задачу за счёт разделения моделей и баз данных для записи и чтения.
Запись (заказы): команды обновляют выделенную нормализованную базу для записи (оптимизированную под транзакции).
Чтение (отчёты): события записи асинхронно обновляют отдельную денормализованную базу для чтения (оптимизированную под быстрые запросы и отчётность).
CQRS чаще всего реализуется с использованием брокера сообщений.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Проект JDBG от roger1337 позволяет подключаться к JVM во время выполнения и исследовать внутреннее состояние Java-программы.
Инструмент использует JNI + JVMTI + DLL-инъекцию, поддерживает просмотр классов, байткода, стека вызовов, локальных переменных и экземпляров объектов.
Создан для исследовательских и образовательных целей, под лицензией Apache 2.0.
https://github.com/roger1337/JDBG
👉 Java Portal
Инструмент использует JNI + JVMTI + DLL-инъекцию, поддерживает просмотр классов, байткода, стека вызовов, локальных переменных и экземпляров объектов.
Создан для исследовательских и образовательных целей, под лицензией Apache 2.0.
https://github.com/roger1337/JDBG
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3🔥3
В Spring Boot ProductController нужно обработать два разных случая:
1. Вернуть простой 404 Not Found, если продукт не найден.
2. Вернуть 201 Created с динамическим заголовком Location при успешном создании.
Какие механизмы Spring вы бы использовали для реализации каждого из этих требований и почему?
Два основных способа управлять HTTP-ответом, отправляемым клиенту:
→
- Можно навесить на исключение или метод контроллера.
- Всегда возвращает один и тот же HTTP-статус.
- Подход "fire-and-forget": быстро и лаконично в случаях, когда ответ всегда одинаковый.
- Лучше всего подходит для простой обработки ошибок. Например, ResourceNotFoundException, аннотированный
- Нельзя добавить кастомные заголовки или динамическое тело ответа.
→
- Даёт полный программный контроль над формированием HTTP-ответа во время выполнения.
- Можно выставить статус, добавить заголовки и собрать тело ответа так, как требуется по логике.
- Лучше всего подходит для сложных ответов. Например, когда нужно добавить заголовок Location после создания ресурса (201 Created) или вернуть детализированный JSON-объект с информацией об ошибке.
- Это основной инструмент, когда ответ должен зависеть от ситуации.
Комбинация подходов:
Используя
👉 Java Portal
1. Вернуть простой 404 Not Found, если продукт не найден.
2. Вернуть 201 Created с динамическим заголовком Location при успешном создании.
Какие механизмы Spring вы бы использовали для реализации каждого из этих требований и почему?
Два основных способа управлять HTTP-ответом, отправляемым клиенту:
→
@ResponseStatus
: простой статический вариант- Можно навесить на исключение или метод контроллера.
- Всегда возвращает один и тот же HTTP-статус.
- Подход "fire-and-forget": быстро и лаконично в случаях, когда ответ всегда одинаковый.
- Лучше всего подходит для простой обработки ошибок. Например, ResourceNotFoundException, аннотированный
@ResponseStatus(HttpStatus.NOT_FOUND)
, всегда будет возвращать 404.- Нельзя добавить кастомные заголовки или динамическое тело ответа.
→
ResponseEntity
: кастомный инструмент - Даёт полный программный контроль над формированием HTTP-ответа во время выполнения.
- Можно выставить статус, добавить заголовки и собрать тело ответа так, как требуется по логике.
- Лучше всего подходит для сложных ответов. Например, когда нужно добавить заголовок Location после создания ресурса (201 Created) или вернуть детализированный JSON-объект с информацией об ошибке.
- Это основной инструмент, когда ответ должен зависеть от ситуации.
Комбинация подходов:
Используя
@RestControllerAdvice
для глобальной обработки исключений, можно применять @ResponseStatus
для типовых ошибок, а ResponseEntity — для более специфичных и динамичных ответов. Такой подход даёт одновременно и эффективность, и гибкость.Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤5
Учись Git прямо в браузере
Теперь можно тренироваться с командами Git, не устанавливая ничего на свой компьютер.
Прямо в браузере запускаешь команды и сразу видишь, что делает каждая из них, идеально для обучения и практики.
Попробовать можно здесь
👉 Java Portal
Теперь можно тренироваться с командами Git, не устанавливая ничего на свой компьютер.
Прямо в браузере запускаешь команды и сразу видишь, что делает каждая из них, идеально для обучения и практики.
Попробовать можно здесь
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍6
Генерация тестовых данных
Чтобы написать хороший тест, нужны хорошие тестовые данные, приближенные к production. Плохо подготовленные данные = плохо написанный тест.
Поэтому практически все тесты должны состоять из трех основных частей:
- given (подготовка данных и стабов для mock/spy)
- when (вызов тестируемого API)
- then (проверка результата)
Сложно написать хороший тест, полагаясь на данные, которые уже существуют в базе в момент запуска теста (за исключением справочных данных или тех, что были накатаны на production с помощью миграционных фреймворков вроде liquibase и flyway). Обычно на эти данные полагаются другие тесты, а потому часто меняются, что ломает наши тесты или делает их даже flaky.
Поэтому каждый тест должен в идеале готовить данные только для себя, на которых он планирует проверить API:
А чтобы не испортить состояние базы во время проверки, то:
- открываем транзакцию ПЕРЕД выполнением теста (
- накатываем данные, вызываем API и проверяем результат (
- откатываем транзакцию в конце (
👉 Java Portal
Чтобы написать хороший тест, нужны хорошие тестовые данные, приближенные к production. Плохо подготовленные данные = плохо написанный тест.
Поэтому практически все тесты должны состоять из трех основных частей:
- given (подготовка данных и стабов для mock/spy)
- when (вызов тестируемого API)
- then (проверка результата)
Сложно написать хороший тест, полагаясь на данные, которые уже существуют в базе в момент запуска теста (за исключением справочных данных или тех, что были накатаны на production с помощью миграционных фреймворков вроде liquibase и flyway). Обычно на эти данные полагаются другие тесты, а потому часто меняются, что ломает наши тесты или делает их даже flaky.
Поэтому каждый тест должен в идеале готовить данные только для себя, на которых он планирует проверить API:
@Test
void findAll() {
// given
// Все компактно, содержит только необходимую информацию для программиста
User user1 = userDao.save(getUser("test1@gmail.com"));
User user2 = userDao.save(getUser("test2@gmail.com"));
User user3 = userDao.save(getUser("test3@gmail.com"));
// when
List<User> actualResult = userDao.findAll();
// then
// Легко получить доступ к id объектов, т.к. накатывание данных было в самом тесте
assertThat(actualResult).hasSize(3);
List<Integer> userIds = actualResult.stream()
.map(User::getId)
.toList();
assertThat(userIds).contains(user1.getId(), user2.getId(), user3.getId());
}
А чтобы не испортить состояние базы во время проверки, то:
- открываем транзакцию ПЕРЕД выполнением теста (
@BeforeEach
)- накатываем данные, вызываем API и проверяем результат (
@Test
)- откатываем транзакцию в конце (
@AfterEach
)Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍2
JEP 511 в Java добавляет возможность краткого импорта всех пакетов, экспортируемых модулем. Это облегчает повторное использование модульных библиотек без необходимости помещать импортирующий код в модуль.
Подробнее: https://openjdk.org/jeps/511
👉 Java Portal
Подробнее: https://openjdk.org/jeps/511
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Одна из самых частых тем на собеседованиях Java/backend-разработчиков ⇒ Проблема N+1 в JPA
→ 1 первичный запрос: получение N родительских сущностей.
→ Затем N дополнительных запросов: для каждой из этих N сущностей выполняется отдельный запрос, чтобы загрузить связанные дочерние данные.
→ В итоге выполняется 1 + N запросов к БД, что приводит к снижению производительности и замедлению отклика.
Пример:
Получаем 100 авторов (1 запрос), а затем в цикле вызываем author.getBooks() для каждого (N=100) — в итоге 101 запрос.
⇒ Как решить проблему N+1 в JPA
⇆ Цель — загрузить связанные данные за меньшее количество запросов, желательно за один проход к базе.
1. JPQL/HQL JOIN FETCH (рекомендуется для конкретных связей)
Позволяет явно указать JPA, что ассоциации нужно подгружать через JOIN в запросе.
Пример:
Плюсы: один эффективный запрос.
Важно: при джойне нескольких коллекций можно получить декартово произведение.
2. Batch Fetching
(
Вместо одного запроса на каждого родителя, связанные коллекции загружаются пакетами — по нескольким ID за один запрос.
Пример:
Плюсы: уменьшает количество запросов с 1 + N до 1 + (N / batch_size), избегая проблемы декартовых произведений.
3. Entity Graphs
(
Позволяет декларативно определить, какие связи нужно подгружать eagerly для конкретного метода репозитория.
Пример:
Плюсы: гибкая и переиспользуемая стратегия загрузки без явных JPQL JOIN’ов.
Всегда используйте явные стратегии загрузки (такие как JOIN FETCH,
👉 Java Portal
→ 1 первичный запрос: получение N родительских сущностей.
→ Затем N дополнительных запросов: для каждой из этих N сущностей выполняется отдельный запрос, чтобы загрузить связанные дочерние данные.
→ В итоге выполняется 1 + N запросов к БД, что приводит к снижению производительности и замедлению отклика.
Пример:
Получаем 100 авторов (1 запрос), а затем в цикле вызываем author.getBooks() для каждого (N=100) — в итоге 101 запрос.
⇒ Как решить проблему N+1 в JPA
⇆ Цель — загрузить связанные данные за меньшее количество запросов, желательно за один проход к базе.
1. JPQL/HQL JOIN FETCH (рекомендуется для конкретных связей)
Позволяет явно указать JPA, что ассоциации нужно подгружать через JOIN в запросе.
Пример:
@Query("SELECT a FROM Author a JOIN FETCH a.books")
List<Author> findAllWithBooks();
Плюсы: один эффективный запрос.
Важно: при джойне нескольких коллекций можно получить декартово произведение.
2. Batch Fetching
(
@BatchSize
или hibernate.default_batch_fetch_size
)Вместо одного запроса на каждого родителя, связанные коллекции загружаются пакетами — по нескольким ID за один запрос.
Пример:
@BatchSize(size = 10)
@OneToMany(...)
private List<Book> books;
Плюсы: уменьшает количество запросов с 1 + N до 1 + (N / batch_size), избегая проблемы декартовых произведений.
3. Entity Graphs
(
@EntityGraph
— Spring Data JPA / JPA 2.1+)Позволяет декларативно определить, какие связи нужно подгружать eagerly для конкретного метода репозитория.
Пример:
@EntityGraph(attributePaths = "books")
List<Author> findAll();
Плюсы: гибкая и переиспользуемая стратегия загрузки без явных JPQL JOIN’ов.
Всегда используйте явные стратегии загрузки (такие как JOIN FETCH,
@BatchSize
или @EntityGraph
), чтобы избежать проблемы N+1 и обеспечить эффективное взаимодействие с базой данных.Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤4😁1
Распространённые Алгоритмы Балансировки Нагрузки
Статические алгоритмы
Динамические алгоритмы
👉 Java Portal
Статические алгоритмы
1. Круговой Алгоритм
Клиентские запросы отправляются в различные экземпляры сервисов в последовательном порядке. Сервисы обычно должны быть без сохранения состояния.
Недостаток:
- Эта простейшая версия алгоритма будет эффективно работать только в сферической среде в вакууме, где все серверы обладают почти одинаковой конфигурацией, а все входящие запросы (задачи, процессы) имеют одинаковые приоритет и продолжительность.
2. Закреплённый Круговой Алгоритм
Усовершенствование кругового алгоритма. Если первый запрос Алисы отправляется в сервис A, следующие запросы также отправляются в сервис A.
3. Взвешенный Круговой Алгоритм
Администратор может указать вес для каждого сервиса. Сервисы с более высоким весом обрабатывают больше запросов, чем другие.
4. Хэш IP/URL
Применяет хеш-функцию к IP или URL входящих запросов. Запросы направляются в соответствующие экземпляры на основе результата хеш-функции.
Преимущества:
- Постоянство сессии – алгоритм гарантирует, что запросы от одного клиента всегда попадают на один и тот же сервер.
- Облегчает кеширование данных на стороне сервера для конкретных клиентов.
Недостатки:
- Если много пользователей приходят из одного диапазона IP, один сервер может быть перегружен.
- Неэффективен в средах, где IP клиентов часто меняются (мобильные сети).
- Может привести к неравномерной нагрузке, если некоторые клиенты генерируют больше трафика.
Динамические алгоритмы
5. Наименьшее Количество Соединений
Новый запрос отправляется в экземпляр сервиса с наименьшим количеством одновременных подключений.
Преимущества:
- Более мощные серверы естественным образом будут обрабатывать больше запросов и, следовательно, иметь больше соединений. И напротив, менее мощные серверы будут получать меньше запросов, что предотвращает их перегрузку.
- Гибкость – если один сервер начинает работать медленнее, он будет получать меньше новых запросов.
Недостатки:
- Алгоритм считает все соединения одинаковыми, не учитывая, что некоторые запросы могут быть более ресурсоёмкими.
- Вновь добавленный сервер может получить слишком много запросов, т.к. изначально у него 0 соединений.
6. Наименьшее Время Ответа
Новый запрос отправляется в экземпляр сервиса с самым быстрым временем ответа. Аналогичный алгоритм - Наименьший объем трафика
Преимущества:
- Учёт текущей производительности серверов и динамическая адаптация обеспечивают оптимальный баланс и наилучший пользовательский опыт.
- Хорошо работает с серверами разной мощности и приложениями с разными характеристиками.
Недостаток:
- Сложность реализации – требует постоянного мониторинга и анализа производительности серверов, отсюда повышенная нагрузка на балансировщик.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Полный Roadmap для Spring Boot разработчика
Много разработчиков ищут структурированный путь от новичка до продвинутого уровня в Spring Boot. Ниже представлен 3-фазный roadmap, который поможет освоить все ключевые концепции и инструменты.
PHASE 1
- Создание Spring Boot проекта через Spring Initializer
- Maven и Gradle
- Основные аннотации
- Профили и конфигурации для разных окружений
-
- Path variables и request parameters
- Настройка баз данных (H2, MySQL, PostgreSQL)
- Использование
- Spring Boot DevTools и hot reloading
- Spring Batch, Scheduling и Cron выражения
PHASE 2
-
- Кастомные ошибки и глобальная обработка исключений
- Базовая аутентификация и настройка безопасности API
- JWT для stateless аутентификации
- HATEOAS и версионирование REST API (URI, параметры, headers)
- Unit-тесты с JUnit и Mockito
- Интеграционные тесты с Spring Boot Test и MockMvc
- Actuator endpoints и кастомные health indicators
PHASE 3
-
- Spring Cloud: Eureka Server, Service Discovery, API Gateway
- Spring Cloud Config Server для централизованного управления конфигурациями
- Настройка Spring Boot приложений для работы с Config Server
Чтобы полностью усвоить материал, постройте свои проекты на каждом этапе. Практика поможет закрепить знания и сделает их долговечными.
👉 Java Portal
Много разработчиков ищут структурированный путь от новичка до продвинутого уровня в Spring Boot. Ниже представлен 3-фазный roadmap, который поможет освоить все ключевые концепции и инструменты.
PHASE 1
- Создание Spring Boot проекта через Spring Initializer
- Maven и Gradle
- Основные аннотации
- Профили и конфигурации для разных окружений
-
@GetMapping
, @PostMapping
, @PutMapping
, @DeleteMapping
- Path variables и request parameters
- Настройка баз данных (H2, MySQL, PostgreSQL)
- Использование
JpaRepository
и CrudRepository
- Spring Boot DevTools и hot reloading
- Spring Batch, Scheduling и Cron выражения
PHASE 2
-
@ControllerAdvice
и @ExceptionHandler
- Кастомные ошибки и глобальная обработка исключений
- Базовая аутентификация и настройка безопасности API
- JWT для stateless аутентификации
- HATEOAS и версионирование REST API (URI, параметры, headers)
- Unit-тесты с JUnit и Mockito
- Интеграционные тесты с Spring Boot Test и MockMvc
- Actuator endpoints и кастомные health indicators
PHASE 3
-
@Profile
и настройка бинов для разных окружений - Spring Cloud: Eureka Server, Service Discovery, API Gateway
- Spring Cloud Config Server для централизованного управления конфигурациями
- Настройка Spring Boot приложений для работы с Config Server
Чтобы полностью усвоить материал, постройте свои проекты на каждом этапе. Практика поможет закрепить знания и сделает их долговечными.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5❤4🏆1