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

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
Как отладить медленный API

Твой API тормозит. Пользователи жалуются. И ты не понимаешь, с чего вообще начать. Вот пошаговый подход, который поможет вычислить, что именно душит производительность.

1. Начни с сети.
Высокая задержка? Поставь CDN перед статикой. Слишком большой payload? Сжимай ответы. Это простые решения, не требующие правки кода.

2. Проверь бэкенд.
Чаще всего проблема там. Тяжелые по CPU операции нужно выносить в фон. Сложная бизнес-логика — упрощать. Синхронные блокирующие вызовы — делать асинхронными. Прогони профилирование, найди узкие места и оптимизируй.

3. Загляни в базу данных.
Отсутствующие индексы — классическая причина тормозов. Ещё одна ловушка — N+1 запросы, когда вместо одного батч-запроса база получает сотни одинаковых обращений.

4. Не забудь про внешние API.
Вызовы вроде Stripe или Google Maps не под твоим контролем. Где возможно — запускай их параллельно. Настрой агрессивные таймауты и ретраи, чтобы один медленный сторонний сервис не тормозил весь ответ.

5. Проверь инфраструктуру.
Если серверы забиты под завязку — настрой авто-масштабирование. Подкорректируй лимиты connection pool. Иногда дело не в коде, а в том, что ты пытаешься обслужить 10 000 запросов на ресурсах, рассчитанных на 100.


Главное действовать системно. Не бросайся фиксить вслепую. Сначала измерь, найди конкретное узкое место — потом исправляй.

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

Как заставить три потока — T1, T2 и T3 — выполняться строго по очереди, один за другим?

Сценарий:

Ты разрабатываешь пайплайн обработки данных, который состоит из трёх этапов:

Скачивание данных с удалённого источника,

Обработка скачанных данных,

Сохранение результатов в базу данных.

Каждый этап должен выполняться в отдельном потоке, но строго последовательно: второй этап начинается только после завершения первого, а третий — только после второго. Как реализовать это, чтобы гарантировать порядок выполнения?

Подсказка:

Метод Thread.join() позволяет одному потоку дождаться завершения другого. Когда поток вызывает t.join(), он приостанавливает своё выполнение и ждёт, пока поток t не завершится.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍3
Как @Component в Spring управляет зависимостями

В статье объясняется, что аннотация @Component помечает класс как bean, Spring сканирует такие классы и создаёт экземпляры для автосвязывания. @Component — основа для @Service, @Repository и @Controller, важная деталь DI в Spring.

Подробности: http://www.java67.com/2023/04/what-is-component-annotation-in-spring.html

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Spring Boot: используй spring-boot-starter-mail для отправки писем.

Этот стартер включает все необходимые зависимости и настройки, делая процесс отправки писем простым и понятным.

// Добавь зависимость:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

// Настрой параметры почты в application.properties (или application.yml):
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=my_email@gmail.com
spring.mail.password=my_password
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true

// Используй JavaMailSender в коде:
...
@Autowired
private JavaMailSender mailSender;

public void sendEmail(String to, String subject, String text) {
SimpleMailMessage message = new SimpleMailMessage();
message.setTo(to);
message.setSubject(subject);
message.setText(text);
message.setFrom("your_email@gmail.com");

mailSender.send(message);
}
...


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
213👍3🔥2
PocketBase — лёгкий open-source бэкенд в одном файле для быстрого создания приложений с базой данных, аутентификацией, хранением файлов и панелью администратора. Идеален для прототипов и небольших проектов.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
4🔥2
Совет по продвинутому использованию Spring

Используйте Spring SSEEvent для плавных реальных обновлений в ваших приложениях.

@GetMapping("/events")
public Flux<ServerSentEvent<String>> events() {
return Flux.interval(Duration.ofSeconds(1)) // каждую секунду создаётся новое событие
.map(sequence -> ServerSentEvent.<String>builder()
.id(String.valueOf(sequence)) // задаём ID события
.event("message") // тип события (можно использовать для фильтрации на клиенте)
.data("Event #" + sequence + " @ " + LocalTime.now()) // данные события
.build());
}


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍2
Вся линейка JDK уже доступна! Теперь можно использовать все основные сборки Java 25, включая IBM Semeru на движке OpenJ9 🙌

Читай в их блоге, чтобы узнать, как установить свежий JDK в свою IDE.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
8
Spring Boot tip:

Используй CommandLineRunner, если нужно выполнить код сразу после того, как приложение полностью поднялось и контекст инициализирован.

CommandLineRunner — это интерфейс Spring Boot, который позволяет запускать любую логику при старте приложения.

Удобно для:

заполнения базы начальными данными,
проверки состояния сервисов,
инициализации внешних ресурсов.

Пример:

@Component
public class StartupRunner implements CommandLineRunner {

@Override
public void run(String... args) {
System.out.println("App started! Further setup");
}
}


Такой класс автоматически выполнится один раз при запуске Spring Boot.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍42
Тебе не нужно дробить приложение на 20 репозиториев и 15 сервисов, чтобы получить модульность.
Это можно спокойно реализовать внутри грамотно спроектированного модульного монолита.

1. Разделяй модули по функциональным доменам.

Пример: пользователи, платежи, уведомления, отчёты.
Каждый модуль — это свой пакет со своими сущностями, сервисами и бизнес-логикой.

2. Определи чёткие интерфейсы между модулями.

Один модуль не должен знать внутренние классы другого.
Общай их через интерфейсы или внутренние события (например, Spring Events).
Так сохраняется слабое связывание и высокая связность.

3. Избегай циклических зависимостей.

Если модуль A зависит от B, убедись, что B никогда не зависит от A.
Разрывай такие циклы с помощью интерфейсов, dependency injection или событий.

4. Придерживайся принципа внутренних слоёв.

В каждом модуле разделяй внутренние части (entities, repositories, services) и то, что наружу (controllers, DTO, API).

5. Рассмотри использование Spring Modulith (для Java/Kotlin).

Он не заставляет переходить на микросервисы, но даёт инструменты для организации модулей, проверки зависимостей и документирования архитектуры.

6. Опционально: подумай о доменных событиях.

Они помогают масштабировать модульность, не ломая монолит.
И если потом решишь вынести модуль отдельно — половина работы уже сделана.

Модульность зависит не от размера системы, а от чёткости её границ.

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

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍53
Совет по Spring Boot:

используй spring-boot-starter-logging (на Logback) для логирования — он уже подключён по умолчанию.

spring-boot-starter-logging уже включён во большинство стартеров, например spring-boot-starter-web, spring-boot-starter-data-jpa и т.д.

Можно настраивать уровни логирования, отредактировав application.yml:

logging:
level:
root: INFO
com.myapp: DEBUG


Чтобы изменить формат логов и политику ротации, создай файл logback-spring.xml в каталоге src/main/resources.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
This media is not supported in your browser
VIEW IN TELEGRAM
ChartDB это опенсорс-инструмент для работы с SQL-базами данных через визуальный интерфейс.

Что умеет:

✓ интерактивная диаграмма со всеми таблицами и связями
✓ можно скачать схему как PNG-картинку
✓ поддерживает MySQL, PostgreSQL, SQLite и другие

app.chartdb.io

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
4
Spring Boot: можно выполнять задачи через фиксированные интервалы без настройки Quartz или внешних планировщиков.

Добавь @EnableScheduling в любой конфигурационный или основной класс приложения:

@SpringBootApplication
@EnableScheduling
public class MainApp { }


Используй @Scheduled для метода:

@Component
public class Scheduler {

@Scheduled(fixedRate = 5000)
public void executeTask() {
...
}
}


@EnableScheduling активирует механизм планирования, а @Scheduled задаёт частоту выполнения метода (fixedRate = 5000 — каждые 5 секунд).

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
1
У тебя есть 3 сервера. Приходит 100 запросов. Как их распределить? Вот возможные варианты:

Алгоритмы балансировки нагрузки

🔸Round Robin (циклический)

- Запрос 1 —> на сервер A
- Запрос 2 —> на сервер B
- Запрос 3 —> на сервер C
- Запрос 4 —> снова на сервер A
- И так по кругу бесконечно

Когда использовать: все сервера одинаковые, запросы примерно равны по времени обработки. Самый простой вариант.

🔸Weighted Round Robin (взвешенный циклический)

- Сервер A: 4 ядра, вес 4
- Сервер B: 8 ядер, вес 8
- Сервер C: 4 ядра, вес 4
- Из каждых 16 запросов: A получает 4, B — 8, C — 4

Когда использовать: мощности серверов разные, нужно распределять нагрузку пропорционально.

🔸Least Connections (наименьшее количество соединений)

- Сервер A: 50 активных соединений
- Сервер B: 30 активных соединений
- Сервер C: 45 активных соединений
- Следующий запрос уходит на сервер B (у него меньше всего соединений)

Когда использовать: запросы обрабатываются разное время, есть долгоживущие соединения, например WebSocket.

🔸Weighted Least Connections (взвешенный по соединениям)

- Сервер A: 50 соединений, 4 ядра → соотношение 12.5
- Сервер B: 30 соединений, 8 ядер → соотношение 3.75
- Сервер C: 45 соединений, 4 ядра → соотношение 11.25
- Следующий запрос идёт на сервер B (самое низкое соотношение)

Когда использовать: сервера разной мощности, при этом соединения держатся долго.

🔸IP Hash (хеш по IP)

- IP пользователя: 192.168.1.100
- Этот IP хешируется и всегда маршрутизируется на сервер B
- Один и тот же пользователь всегда попадает на один и тот же сервер

Когда использовать: нужна привязка сессии к конкретному серверу, нет общего session storage. Sticky sessions.

🔸Least Response Time (наименьшее время отклика)

- Сервер A: средний отклик 200 мс
- Сервер B: 150 мс
- Сервер C: 300 мс
- Следующий запрос уходит на сервер B (самый быстрый)

Когда использовать: производительность серверов разная, например, для чтения из реплик БД с разным lag.

🔸Random (случайное распределение)

- Просто выбирается случайный сервер
- Ничего отслеживать не нужно
- На больших масштабах работает удивительно неплохо

Когда использовать: простые распределённые системы, stateless-сервисы, когда учёт состояния не оправдан.

В большинстве продакшн-систем хорошо себя показывает вариант Least Connections с весами.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
В Spring Boot аннотация @DataJpaTest используется для изолированного тестирования JPA-репозиториев.

@DataJpaTest поднимает только JPA-слой, не загружая весь контекст приложения.
Тесты выполняются с использованием встроенной базы данных, например H2, а после каждого теста все транзакции автоматически откатываются.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
29 октября(уже сегодня!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью по System Design.

Как это будет:
📂 Дмитрий Дорофеев, TeamLead в американском FitTech Truv Inc, ex-VK, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Дмитрий будет комментировать каждый ответ респондента, чтобы дать понять, чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Дмитрию

Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.

Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot

Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
Maven Plugin Tip — DepClean

DepClean автоматически чистит дерево зависимостей в Java-проектах. Он удаляет все зависимости, которые прописаны в дереве, но при сборке на самом деле не нужны. 🔥

https://github.com/ASSERT-KTH/depclean

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍2🔥2